有一網友問:關於MS SQLSERVER索引優化問題:
有表Stress_test(id int, key char(2))
id 上有普通索引;
key 上有簇索引;
id 有有限量的重復;
key 有無限量的重復;
現在我需要按邏輯與查詢表中key='Az' AND key='Bw' AND key='Cv' 的id
求教高手最有效的查詢語句
測試環境:
Hardware:P4 2.6+512M+80G
Software:Windows server 2003(Enterprise Edition)+Sqlserver 2000 +sp3a
首先我們建立一個測試的數據,為使數據盡量的分布和隨即,我們通過RAND()來隨機產生2個隨機數再組合成一個字符串,首先插入的數據是1,000,000條記錄,然後在循環插入到58,000,000條記錄。
因為是隨機產生的數據,所以如果你自己測試的數據集和我測試的會不一樣,但對索引的優化和運行的效率是一樣的。
下面的“--//測試腳本”是產生測試數據的腳本,你可以根據需要修改 @maxgroup, @maxLoop的值,比如測試1百萬的記錄可以:
Select @maxgroup=1000
Select @maxLoop=1000
如果要測試5千萬:
Select @maxgroup=5000
Select @maxLoop=10000
所以如果你的SERVER或PC比較慢,請耐心等待.....,
(在我的PC上運行的速度是插入1百萬條的時間是1.14m,插入5千八百萬條的時間是19.41m,重新建立INDEX的時間是34.36m)
作為一般的開發人員很容易就想到的語句:
--語句1
select a.[id] from
(select distinct [id] from stress_test where [key] = 'Az') a,
(select distinct [id] from stress_test where [key] = 'Bw') b ,
(select distinct [id] from stress_test where [key] = 'Cv') c
where a.id = b.id and a.id = c.id
--語句2
select [id]
from stress_test
where [key]='Az' or [key]='Bw' or [key]='Cv'
group by id having(count(distinct [key])=3)
--語句5
SELECT distinct a.[id] FROM stress_test AS a,stress_test AS b,stress_test AS c
WHERE a.[key]='Az' AND b.[key]='Bw' AND c.[key]='Cv'
AND a.[id]=b.[id] AND a.[id]=c.[id]
但作為T-SQL的所謂“高手”可能會認為這種寫法很“土”,也顯得沒有水平,所以會選擇一些子查詢和外連接的寫法,按常理子查詢的效率是比較高的:
--語句3
select distinct [id] from stress_test A where
not exists (
select 1 from
(select 'Az' as k union all select 'Bw' union all select 'Cv') B
left join s