在对两个查询使用“显示估计执行计划”之后,我最终创建了两个索引,如下所示:
CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table
(colA,colB,colC)
和
CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table
(colA,colD,colE)
我注意到只创建了一个索引(取代上面两个):
CREATE NONCLUSTERED INDEX IX_ABC ON dbo.my_table
(colA,colB,colC,colD,colE)
还优化了我的查询。
所以我的问题是,所有列的索引是否优化以及两个独立的索引是正确的,还是一种优于另一种的方法。
由于
答案 0 :(得分:2)
不,绝对没有。您的查询更有可能需要包含所有列的索引以及两个单独的列
是否正确
(colA) INCLUDE (colB, colC, colD, colE)
上的索引,或者colA
实际上是一个很好的群集密钥候选者。这是您提出的一般情况,无法得出真正的结论。但是,作为一般规则,不同列上的索引服务于不同的角色,并且可以由不同的查询使用。 (A, B, C)
上的索引绝不能代替(B, C)
,(B, D)
或(C, E)
上的索引。即使不同的列顺序也无法替换,(A, B, C)
上的索引不同,无法替换(B, C, A)
上的索引。
我建议你先处理Designing Indexes的主题。阅读完毕后,请随时提出更多问题。
答案 1 :(得分:2)
在回答你的问题时,两种优化并不相同。
至于一种方法是否优先于另一种方法,它实际上取决于您的查询是什么,以及您如何修改数据。
如果您在(ColA,ColB,ColC)上有一个特定where
子句的查询,而另一个(ColA,ColD,ColE),则这两个索引将很好地服务于该场景。
但是,如果您经常更新表,那么您将需要额外的维护两个索引的开销。
与此类似,您最好进行permormance分析,并根据预期访问模式获取指标。
答案 2 :(得分:1)
简单地回答你的问题,顺序很重要(想想一个多级树),所以综合索引对于只搜索ColA,ColD和ColE而不是ColB和ColC的查询没有帮助。
所以,例如,如果你有一个类似的查询
SELECT colA, colD, colE
FROM dbo.my_table
WHERE colA = 1 AND colD = 2
第二个(组合)索引会有所帮助(使用'ColA'谓词),但数据库仍然必须扫描colD = 2的剩余结果。
另一方面,组合索引将占用较少的总空间,并且对A列的更新影响较小,因此您必须权衡权衡。