程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> MS SQLSERVER索引優化

MS SQLSERVER索引優化

編輯:關於SqlServer

有一網友問:關於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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved