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

时间:2011-05-31 13:27:05

标签: sql sql-server sql-server-2005 sql-server-2008

我刚刚从这里阅读https://stackoverflow.com/questions/6187904/hard-and-fast-rule-for-include-columns-in-index 关于包含的列。

n索引通常是

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

其中:

  • KeyColList =键列=用于行限制和处理
    在哪里,加入,订购,分组等
  • 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是主键

2 个答案:

答案 0 :(得分:1)

我认为你会想要这样的东西:

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 :(得分:0)

对于此查询,它取决于每个col-1-6的位置限制的行数。最佳索引是具有最高选择性并且每个值返回最少行的列的列。

group by意味着Col7可能会因为成为索引的一部分而受益,因此行已经回归分组。

如果所有Col 1-6都提供了大量的表格,那么也许是Col7,Col8可能会更好地使该组正确。

但无论如何,您需要进行测试,因为它取决于数据值的分布。