賽迪網 > IT技術 數據庫 > 精彩更新
  IT資訊搜索
 
IT產品搜索
[程式開發][網管世界][網路安全][數據庫技術]
[作業系統][嘉賓聊天·線上訪談][活動集錦]
[精彩專題][Symantec專區][訂閱IT技術週刊]
[開發論壇][網管論壇][安全論壇][數據庫論壇]
[作業系統論壇][Sybase專區][IBM dW技術專區]
[病毒求助][病毒與漏洞播報][文檔·源碼下載]

SQL查詢效率:100w數據查詢只需要1秒鐘

發佈時間:2008.07.24 05:06     來源:賽迪網    作者:晨夕

【賽迪網-IT技術報道】關於SQL查詢效率,100w數據,查詢只要1秒,與您分享:

機器情況:

p4: 2.4

記憶體: 1 G

os: windows 2003

數據庫:

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

-- 耗時 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

)

-- 耗時 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

-- 耗時 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

)

-- 耗時 2 秒

-- step 6 where 查詢

select a.userid,b.nick,b.classid,b.writetime from

(

select top 20 a.userid from

(

select top 90000 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 秒.

查詢效率分析:

子查詢為確保消除重復值,必須為外部查詢的每個結果都處理嵌套查詢。在這種情況下可以考慮用聯接查詢來取代。

如果要用子查詢,那就用EXISTS替代IN、用NOT EXISTS替代NOT IN。因為EXISTS引入的子查詢只是測試是否存在符合子查詢中指定條件的行,效率較高。無論在哪種情況下,NOT IN都是最低效的。因為它對子查詢中的表執行了一個全表遍歷。

建立合理的索引,避免掃描多餘數據,避免表掃描!

幾百萬條數據,照樣幾十毫秒完成查詢。

(責任編輯:盧兆林)


[ 發表評論 ] 字體[  ] [ 列印 ] [ 進入博客 ] [ 進入論壇 ]  [ 推薦給朋友 ]
  相關文章
  客戶需求反饋表
* 姓  名:
更多資料  了解方案  認識廠商
* 單位名稱:
* 聯繫電話:
* 電子郵件:
  賽迪推薦  
  手機·資費 ·新品·導購·評測·手機資費·寬帶
手機搜索  諾基亞 N73 MOTO Z6
  IT產品 ·筆記本·臺式機·伺服器·列印·投影
IT產品搜索 
  IT技術 ·開發·網管·安全·數據庫·作業系統
  資訊化 ·熱點·專題·訪談·週刊·方案案例
· 移動資訊化市場方興未艾 企業呼喚標準出臺
· 如何把握企業價值差異 避免CRM與SCM脫節
· 齊看四大廠商的SaaS動態 ERP案例分析
· 通方期貨CRM解決方案 方正電子公文系統
  IT博客 ·曾劍秋·項立剛·Java學習·網管
  IT技術論壇 ·開發·網管·安全·數據庫·系統