簡體   English   中英

要包含在非聚集索引中的列

[英]Columns to include in nonclustered index

我剛剛從這里閱讀https://stackoverflow.com/questions/6187904/hard-and-fast-rule-for-include-columns-in-index關於包含的列。

n 索引通常是

CREATE INDEX <name> ON <table> (KeyColList) INCLUDE (NonKeyColList)

在哪里:

  • KeyColList = Key columns = 用於行限制和處理
    WHERE、JOIN、ORDER BY、GROUP BY 等
  • NonKeyColList = 非鍵列 = 在選擇/限制后用於 SELECT 和聚合(例如 SUM(col))

現在假設我的查詢是:

SELECT  Col7 ,
        Col8 ,
        Col9 ,
        Col10
FROM    [MyTable] M
WHERE   Col1 =1
        AND Col2=2
        AND Col3=3                         
        AND Col4=4 
        AND Col5=5 
        AND Col6=6
GROUP BY Col7 ,
         Col8 ,
         Col9 ,
         Col10
ORDER BY Col8

在這種情況下,我的索引應該是什么? 和 Col7 是主鍵的第二種情況

我想你會想要這樣的東西:

CREATE NONCLUSTERED INDEX MyIndex ON MyTable(Col1, Col2, Col3, Col4, Col5, Col6)
INCLUDE (Col7, Col8, Col9, Col10)

您正在過濾Col1-Col6並檢索Col7-Col10 不過,不確定這將如何與group by一起使用。 您可能希望將其重寫為DISTINCT ,因為執行計划和結果是相同的,但它會更具可讀性。

如果Col7是主鍵並具有聚集索引,則可以保持原樣。 Col7將被包含在索引中而沒有特別提及,因為集群鍵在每個非聚集索引中作為行標識符,但保留它不會受到傷害,因為 SQL 會忽略它。

對於此查詢,它取決於第 1-6 列中的每一個的位置限制了多少行。 最佳索引是針對具有最高選擇性並返回每個值的行數最少的列的索引。

group by 將意味着 Col7 可能會因成為索引的一部分而受益,因此行已經分組返回。

如果所有的 Col 1-6 都提供了大量的桌子,那么 Col7,Col8 可能會更好地獲得正確的組。

但無論如何,您都需要進行測試,因為它取決於數據值的分布。

暫無
暫無

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

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