2012-01-11 65 views
1

我有一個大約19列的表,其中包含合理的大量數據,主要是使用基於不同where子句的select語句來查詢數據以檢索數據。由於這個表主要是查詢獲取數據,所以我考慮根據查詢中使用的不同where子句創建非聚集索引。此外,所有獲取查詢都將返回表中的所有列作爲選擇列表的一部分。基於以上信息,我有選擇的指標兩個問題:非聚簇覆蓋索引列選擇規則

  1. 讓我們假設我們有以下的SP作爲查詢:

    where [col_a] = {value} and [col_b] = {value} 
    
         [col_b] = {value} and [col_a] = {value} 
    
         [col_a] = {value} and [col_c] = {value} and [col_d] = {value} 
    
         [col_a] = {value} and [col_c] = {value} 
    

    我已經創建了下面的非聚集索引在桌子上作爲

    [爲col_a]和[col_b] - >會在第一SP仍然使用這個索引作爲 次序被逆轉

    [col_a]和[col_c]和[col_d] - >如果最後一個SP使用此索引 ,因爲前兩列與訂單匹配

    另外,我們是否應該繼續嘗試定義非聚集索引在表上獲取SP的過濾器/連接子句?

  2. 由於所有SP中的選擇列表都會返回整個列的列表,因此我將表中的所有列添加爲非聚集索引(覆蓋索引)中的包含列以避免書籤查找。這種方法是否正確?這種情況下的空間含義是什麼?因爲我們將所有表列存儲爲索引定義的一部分?

回答

1

[爲col_a]和[col_b]
會第一SP仍然使用這個指數作爲 的次序被逆轉

是 - 如果指定列,並且您的索引將這兩列作爲其列表中的前兩列包含在內,那麼可以使用索引,並且順序不重要。

如果你有一個指數(col_a, col_b),可如果你指定使用:

  • 只是col_a
  • col_acol_b(順序無關緊要)

不能用於僅指定col_b(但不包含col_a)的查詢。爲了考慮使用,必須按任意順序使用/定義n個最左邊的列(n> = 1)。

[爲col_a]和[col_c]和[col_d]
將在最後SP使用這種索引 作爲前兩列匹配順序

是 - 如我上面提到的,如果使用了n個最左邊的列,則可以考慮索引,因此如果您指定了總共三個中的前兩個,那麼您很好。

警告詞:僅僅因爲您指定了正確的列並不一定意味着該索引實際上將被最終使用。查詢優化器將其視爲以供使用 - 但如果更方便/更快,它可能仍然以另一種方式使用。

1

這裏WHERE子句中的排序不相關。所以,是的,這兩個索引將完美地服務於所有四個示例。

至於幫助JOIN的索引,是的,有一般建議

您可能會發現,如果您創建的索引對於您曾經使用過的每個連接都是完美的,那麼您會有很多索引。寫入表格時可能會導致性能問題。在這種情況下,您可能會發現一些對您的JOIN和WHERE子句不完美的索引,但這些索引足夠好,只需少數幾個即可管理。這是你需要平衡自己的妥協。


最後,請注意,某些RDBMS 可以使用索引合併。這可能意味着多個簡單或較簡單的索引幾乎與複合/覆蓋索引一樣好。但是在大多數情況下,當考慮索引什麼時,您確實需要同時考慮WHERE子句和JOIN。

這是因爲索引的主要特徵是記錄的順序。理想的情況是在一個連續塊中(在您的WHERE子句和連接已將其過濾掉之後)以及對後續JOIN或GROUP BY友好的順序中擁有所有感興趣的記錄。實際上,您的目標是使數據儘可能少地依次排列,並儘可能地按照順序排列。然後讓RDBMS優化器完成其餘的工作:)

相關問題