两列具有几列的索引或一列具有所有列的索引

时间:2012-09-24 13:34:21

标签: sql-server

在对两个查询使用“显示估计执行计划”之后,我最终创建了两个索引,如下所示:

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)

还优化了我的查询。

所以我的问题是,所有列的索引是否优化以及两个独立的索引是正确的,还是一种优于另一种的方法。

由于

3 个答案:

答案 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列的更新影响较小,因此您必须权衡权衡。