我刚刚从这里阅读https://stackoverflow.com/questions/6187904/hard-and-fast-rule-for-include-columns-in-index 关于包含的列。
n索引通常是
CREATE INDEX <name> ON <table> (KeyColList) INCLUDE (NonKeyColList)
其中:
现在让我说我的查询是:
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是主键
答案 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可能会更好地使该组正确。
但无论如何,您需要进行测试,因为它取决于数据值的分布。