簡體   English   中英

SQL重疊和多列索引

[英]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索引雖然在其他索引中功能可用,但會小得多,因此效率更高(關於所需的讀取次數,緩存能力,保留在緩存中等等)。 )。

這當然在很大程度上取決於使用模式等。但是,一般而言,將多個明顯多余的索引作為敏感方法是非常合理的。

索引“重復”的缺點主要是(並且可能是從更大到更小的影響的順序):

  • 對基礎表執行INSERT / UPDATE / DELETE查詢,會產生性能開銷以維護額外的索引。
  • 競爭緩存使用
  • [非常輕微]生成查詢計划的時間較長。
  • 存儲開銷(通常是非問題;確實會增加備份時間,但是......)。

因此,必須估計SELECT查詢的改進性能是否可以從額外索引中獲益,從而抵消了上面列出的缺點。 數據庫性能調優通常是個案練習......

如果,如上所述,單列是多列索引中定義的第一列:它並不總是正確,或者查詢工作負載隨時間發生了變化。 如果多列索引有用且正在使用,則可以刪除單列索引。 但是,配置文件並檢查索引使用情況報告。

如果沒有,那么它適用於不同的查詢。 我注意到DTA喜歡做的一件事是創建一個索引,它本質上是整個表的副本,特別是在ORM發出查詢工作負載的情況下。

與此案例和所有其他案例一樣,您需要進行分析以確定與“正常”查詢工作負載相關的任何索引的有效性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM