[英]SQL Overlapping and Multi-Column Indexes
我試圖調整一些存儲過程並對索引有疑問。 我使用了調優顧問,他們推薦了兩個索引,兩個索引都在同一個表中。 問題是一個索引用於一列,另一個索引用於多個列,其中包含與第一列相同的列。 我的問題是為什么和有什么區別?
CREATE NONCLUSTERED INDEX [_dta_index_Table1_5_2079723603__K23_K17_K13_K12_K2_K10_K22_K14_K19_K20_K9_K11_5_6_7_15_18]
ON [dbo].[Table1] (
[EfctvEndDate] ASC,
[StuLangCodeKey] ASC,
[StuBirCntryCodeKey] ASC,
[StuBirStOrProvncCodeKey] ASC,
[StuKey] ASC,
[GndrCodeKey] ASC,
[EfctvStartDate] ASC,
[StuHspncEnctyIndctr] ASC,
[StuEnctyMsngIndctr] ASC,
[StuRaceMsngIndctr] ASC,
[StuBirDate] ASC,
[StuBirCityName] ASC
) INCLUDE (
[StuFstNameLgl],
[StuLastOrSrnmLgl],
[StuMdlNameLgl],
[StuIneligSnorImgrntIndctr],
[StuExpctdGrdtngClYear]
) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
ON [PRIMARY] go
CREATE NONCLUSTERED INDEX [_dta_index_Table1_5_2079723603__K23]
ON [dbo].[Table1] (
[EfctvEndDate] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
ON [PRIMARY]
“獨立”EfctvEndDate索引雖然在其他索引中功能可用,但會小得多,因此效率更高(關於所需的讀取次數,緩存能力,保留在緩存中等等)。 )。
這當然在很大程度上取決於使用模式等。但是,一般而言,將多個明顯多余的索引作為敏感方法是非常合理的。
索引“重復”的缺點主要是(並且可能是從更大到更小的影響的順序):
因此,必須估計SELECT查詢的改進性能是否可以從額外索引中獲益,從而抵消了上面列出的缺點。 數據庫性能調優通常是個案練習......
如果,如上所述,單列是多列索引中定義的第一列:它並不總是正確,或者查詢工作負載隨時間發生了變化。 如果多列索引有用且正在使用,則可以刪除單列索引。 但是,配置文件並檢查索引使用情況報告。
如果沒有,那么它適用於不同的查詢。 我注意到DTA喜歡做的一件事是創建一個索引,它本質上是整個表的副本,特別是在ORM發出查詢工作負載的情況下。
與此案例和所有其他案例一樣,您需要進行分析以確定與“正常”查詢工作負載相關的任何索引的有效性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.