0

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

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)

还优化了我的查询。

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

谢谢

4

3 回答 3

2

具有所有列的索引以及两个单独的索引都优化是否正确

不,绝对不是。您的查询更有可能需要在 上的索引(colA) INCLUDE (colB, colC, colD, colE),或者colA实际上可能是一个很好的聚集键候选者。这是您提出的一般案例,无法得出真正的结论。但是,作为一般规则,不同列上的索引服务于不同的角色,并且可以被不同的查询使用。上的索引决(A, B, C)不能代替上的索引(B, C)(B, D)(C, E)。即使列的不同顺序也不能替换,索引 on(A, B, C)是不同的,并且不能从索引替换(B, C, A)

我建议您先阅读设计索引的主题。阅读后,请随时提出更多问题。

于 2012-09-24T13:57:41.473 回答
2

在回答您的问题时,不,这两个优化并不等同。

至于一种方法是否优于另一种方法,这实际上取决于您的查询是什么,以及您如何修改数据。

如果您的查询在 (ColA, ColB, ColC) 上有一个特定where子句,在 (ColA, ColD, ColE) 上有另一个子句,那么这两个索引将很好地服务于该场景。

但是,如果您经常更新表,那么您将需要维护两个索引的额外开销。

与类似的事情一样,您最好进行性能分析并根据预期访问模式获取指标。

于 2012-09-24T13:58:37.233 回答
1

为了简单地回答您的问题,顺序很重要(想想多级树),因此组合索引对只搜索 ColA、ColD 和 ColE 而不是 ColB 和 ColC 的查询没有帮助。

因此,例如,如果您有类似的查询 SELECT colA, colD, colE FROM dbo.my_table WHERE colA = 1 AND colD = 2

第二个(组合)索引会有所帮助(使用“ColA”谓词),但数据库仍然需要扫描剩余的结果以查找 colD = 2。

另一方面,组合索引将占用较少的整体空间,并且对 A 列的更新影响较小,因此您必须权衡取舍。

于 2012-09-24T13:56:40.820 回答