Performance

從一開始或出現性能問題時進行索引?

  • February 18, 2012

我的問題是關於索引的使用。

  1. 我應該從一開始就開始索引還是在出現性能問題時開始索引?
  2. 我們還可以在執行查詢時創建臨時索引。這種技術的優缺點是什麼?

我應該從一開始就開始索引還是在出現性能問題時開始索引?

隨著使用模式的出現,索引策略趨於發展。也就是說,也有可以預先應用的策略和設計指南。

  • 選擇一個好的分群鍵。您通常可以在設計時根據對錶的預期插入模式確定適當的聚集索引。如果未來出現令人信服的改變,那就這樣吧。
  • 創建您的主要和其他獨特的約束。這些將由唯一索引強制執行。
  • 創建您的外鍵和關聯的非聚集索引。外鍵是您最常引用的連接列,因此從一開始就對它們進行索引。
  • 為任何明顯具有高度選擇性的查詢創建索引。對於您已經知道的查詢模式將具有高度選擇性,並且可能使用查找而不是掃描。

除此之外,採取漸進和整體的方法來實施新指數。通過整體,我的意思是在評估添加時評估對所有查詢和現有索引的潛在好處和影響。

由於缺少索引 DMV 和 SSMS 提示的指導,SQL Server 圈子中一個不常見的問題是索引過度。這些工具都不會評估現有索引,並且會愉快地建議您創建一個新的 6 列索引,而不是向現有的 5 列索引添加單個列。

-- If you have this
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable] 
(
   [col1] ASC
   , [col2] ASC
   , [col3] ASC
   , [col4] ASC
   , [col5] ASC
)

-- But your query would benefit from the addition of a column
CREATE NONCLUSTERED INDEX [IX_MyTable_MyIndex] ON [dbo].[MyTable] 
(
   [col1] ASC
   , [col2] ASC
   , [col3] ASC
   , [col4] ASC
   , [col5] ASC
   , [col6] ASC
)

-- SSMS will suggest you create this instead
CREATE NONCLUSTERED INDEX [IX_MyTable_AnotherIndexWithTheSameColumnsAsTheExistingIndexPlusCol6] ON [dbo].[MyTable] 
(
   [col1] ASC
   , [col2] ASC
   , [col3] ASC
   , [col4] ASC
   , [col5] ASC
   , [col6] ASC
)

Kimberly Tripp有一些關於索引策略的優秀材料,而 SQL 則適用於其他平台。對於 SQL Server 人員來說,有一些方便的工具可以像上面的範例一樣辨識重複項。

我們還可以在執行查詢時創建臨時索引。這種技術的優缺點是什麼?

這通常只適用於很少執行的查詢,通常是 ETL。您需要評估:

  1. 創建索引所花費的時間是否會減少查詢的執行時間。
  2. 保留索引的維護成本是否超過了在需要時創建/刪除所花費的時間。

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