Sql-Server

綜合指數

  • May 6, 2019

假設我有一個 12 列的表 X。在我的查詢中,我正在過濾這些條件:

select * from x where a=@a and b=@b

select *  from x where a=@b and b=@b and c=@c

select * from x  where a=@b and b=@b and d=@d

select * from x where a=@b and b=@b and e=@e

這個表是非常活躍的表,我需要避免阻塞。如果我需要在這個表上創建索引,我應該像這樣創建 4 個索引:

(a,b) (include columns) 

(a,b,c) (include columns) 

(a,b,d) (include columns) 

(a,b,e) (include columns) 

或者像這樣:

(a,b) (include columns)

(c)

(d)

(e) 

或創建 1 個索引 (a,b,c,d,e) (包括列)

這些是每列的不同值的計數。總行數 1446631 , a = 366279 , b= 96 , c = 6 , e = 2 , d= 11098

如果您的所有查詢模式都包含aand上b的過濾器,並且表被寫入很多,我會主張測試一個看起來像這樣的單個索引:

(a,b) include (c,d,e,other include columns)

原因是要維護一個索引而不是三個或四個,並且過濾器中第三列的選擇性可能不會為單個查詢增加太多額外的好處,因為前兩列已經過濾掉了大部分錶(嗯,實際上是第一列,因為第二列幾乎沒有不同的值)。您可以監控查詢,並查看是否有任何模式或特定參數值導致可怕的錯誤估計、長時間執行或缺少索引警告。我懷疑他們不會,因為再次,根據您引用的密度,只要您的查詢使用過濾器a b或至少,這應該導致非常小的範圍a

我要強調的是,你最終的結果不會是一個簡單的“哦,這顯然是你應該做的”的答案。將需要使用您的**硬體、數據和查詢模式(讀取和寫入)進行測試,以確定最適合您的工作負載的索引。

引用自:https://dba.stackexchange.com/questions/139749