繁体   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