SQL查询效率:100w数据查询只需要1秒钟
生活随笔
收集整理的這篇文章主要介紹了
SQL查询效率:100w数据查询只需要1秒钟
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
機(jī)器情況
p4:?2.4
內(nèi)存:?1?G
os:?windows?2003
數(shù)據(jù)庫:?ms?sql?server?2000
目的:?查詢性能測試,比較兩種查詢的性能
SQL查詢效率?step?by?step
--?setp?1.
--?建表
create?table?t_userinfo
(
userid?int?identity(1,1)?primary?key?nonclustered,
nick?varchar(50)?not?null?default?'',
classid?int?not?null?default?0,
writetime?datetime?not?null?default?getdate()
)
go
--?建索引
create?clustered?index?ix_userinfo_classid?on?t_userinfo(classid)
go
--?step?2.
declare?@i?int?
declare?@k?int
declare?@nick?varchar(10)
set?@i?=?1
while?@i<1000000
begin
set?@k?=?@i?%?10
set?@nick?=?convert(varchar,@i)
insert?into?t_userinfo(nick,classid,writetime)?values(@nick,@k,getdate())
set?@i?=?@i?+?1
end
--?耗時(shí)?08:27?,需要耐心等待
--?step?3.
select?top?20?userid,nick,classid,writetime?from?t_userinfo?
where?userid?not?in
(
select?top?900000?userid?from?t_userinfo?order?by?userid?asc
)
--?耗時(shí)?8?秒?,夠長的
--?step?4.
select?a.userid,b.nick,b.classid,b.writetime?from
(
select?top?20?a.userid?from?
(
select?top?900020?userid?from?t_userinfo?order?by?userid?asc
)?a?order?by?a.userid?desc
)?a?inner?join?t_userinfo?b?on?a.userid?=?b.userid?
order?by?a.userid?asc
--?耗時(shí)?1?秒,太快了吧,不可以思議
--?step?5?where?查詢
select?top?20?userid,nick,classid,writetime?from?t_userinfo?
where?classid?=?1?and?userid?not?in
(
select?top?90000?userid?from?t_userinfo?
where?classid?=?1
order?by?userid?asc
)
--?耗時(shí)?2?秒
--?step?6?where?查詢
select?a.userid,b.nick,b.classid,b.writetime?from
(
select?top?20?a.userid?from?
(
select?top?900000?userid?from?t_userinfo
where?classid?=?1
order?by?userid?asc
)?a?order?by?a.userid?desc
)?a?inner?join?t_userinfo?b?on?a.userid?=?b.userid?
order?by?a.userid?asc
--?查詢分析器顯示不到?1?秒.
查詢效率分析:
子查詢?yōu)榇_保消除重復(fù)值,必須為外部查詢的每個(gè)結(jié)果都處理嵌套查詢。在這種情況下可以考慮用聯(lián)接查詢來取代。
如果要用子查詢,那就用EXISTS替代IN、用NOT?EXISTS替代NOT?IN。因?yàn)镋XISTS引入的子查詢只是測試是否存在符合子查詢中指定條件的行,效率較高。無論在哪種情況下,NOT?IN都是最低效的。因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷。
建立合理的索引,避免掃描多余數(shù)據(jù),避免表掃描!
幾百萬條數(shù)據(jù),照樣幾十毫秒完成查詢
p4:?2.4
內(nèi)存:?1?G
os:?windows?2003
數(shù)據(jù)庫:?ms?sql?server?2000
目的:?查詢性能測試,比較兩種查詢的性能
SQL查詢效率?step?by?step
--?setp?1.
--?建表
create?table?t_userinfo
(
userid?int?identity(1,1)?primary?key?nonclustered,
nick?varchar(50)?not?null?default?'',
classid?int?not?null?default?0,
writetime?datetime?not?null?default?getdate()
)
go
--?建索引
create?clustered?index?ix_userinfo_classid?on?t_userinfo(classid)
go
--?step?2.
declare?@i?int?
declare?@k?int
declare?@nick?varchar(10)
set?@i?=?1
while?@i<1000000
begin
set?@k?=?@i?%?10
set?@nick?=?convert(varchar,@i)
insert?into?t_userinfo(nick,classid,writetime)?values(@nick,@k,getdate())
set?@i?=?@i?+?1
end
--?耗時(shí)?08:27?,需要耐心等待
--?step?3.
select?top?20?userid,nick,classid,writetime?from?t_userinfo?
where?userid?not?in
(
select?top?900000?userid?from?t_userinfo?order?by?userid?asc
)
--?耗時(shí)?8?秒?,夠長的
--?step?4.
select?a.userid,b.nick,b.classid,b.writetime?from
(
select?top?20?a.userid?from?
(
select?top?900020?userid?from?t_userinfo?order?by?userid?asc
)?a?order?by?a.userid?desc
)?a?inner?join?t_userinfo?b?on?a.userid?=?b.userid?
order?by?a.userid?asc
--?耗時(shí)?1?秒,太快了吧,不可以思議
--?step?5?where?查詢
select?top?20?userid,nick,classid,writetime?from?t_userinfo?
where?classid?=?1?and?userid?not?in
(
select?top?90000?userid?from?t_userinfo?
where?classid?=?1
order?by?userid?asc
)
--?耗時(shí)?2?秒
--?step?6?where?查詢
select?a.userid,b.nick,b.classid,b.writetime?from
(
select?top?20?a.userid?from?
(
select?top?900000?userid?from?t_userinfo
where?classid?=?1
order?by?userid?asc
)?a?order?by?a.userid?desc
)?a?inner?join?t_userinfo?b?on?a.userid?=?b.userid?
order?by?a.userid?asc
--?查詢分析器顯示不到?1?秒.
查詢效率分析:
子查詢?yōu)榇_保消除重復(fù)值,必須為外部查詢的每個(gè)結(jié)果都處理嵌套查詢。在這種情況下可以考慮用聯(lián)接查詢來取代。
如果要用子查詢,那就用EXISTS替代IN、用NOT?EXISTS替代NOT?IN。因?yàn)镋XISTS引入的子查詢只是測試是否存在符合子查詢中指定條件的行,效率較高。無論在哪種情況下,NOT?IN都是最低效的。因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷。
建立合理的索引,避免掃描多余數(shù)據(jù),避免表掃描!
幾百萬條數(shù)據(jù),照樣幾十毫秒完成查詢
總結(jié)
以上是生活随笔為你收集整理的SQL查询效率:100w数据查询只需要1秒钟的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 那两个女人
- 下一篇: Extension Method (확장