首页 > 解决方案 > 两个非聚集索引在 sql server 中具有相似的 index_keys 列

问题描述

创建了一个没有索引的tableA,并且表中存在数据。为了提高性能的读/写速度,需要索引。

表A的索引如下:

tableA_IDX nonclustered 位于 PRIMARY COL1
tableA_IDX2 nonclustered 位于 PRIMARY COL1、COL2、COL3
tableA_IDX3 nonclustered 位于 PRIMARY COL1、COL4、COL2

**COL1/2/3/4 有 varchar(15)

tableA_IDX2 和 tableA_IDX3 都有相同的 index_keys:COL1,COL2

问题:它们是否应该组合在一起作为一个索引以加快读取速度,如下所示: tableA_IDX2 nonclustered 位于 PRIMARY COL1, COL2, COL3, COL4 上?

标签: sql-serverperformanceindexing

解决方案


COL1, COL2, COL3, COL4可以在使用索引的地方使用索引COL1, COL2, COL3。它的大小当然会更大。

COL1, COL2, COL3, COL4可以在使用索引的地方使用索引,但COL1, COL4, COL2效率不高。考虑这个例子:

SELECT *
FROM t
WHERE COL1 = 'x'
AND   COL4 = 'y'
AND   COL2 BETWEEN 10 AND 20

上的索引COL1, COL4, COL2将使用index seek。然而,索引COL1, COL2, COL3, COL4首先需要 SQL Server 查找 COL1 = 'x' 和 COL2 介于 10 和 20 之间的索引部分,但随后它必须扫描该部分以找到刚刚发生的 COL4 = 'y' 的值位于索引的底部。这可能快或慢,取决于 COL3 中值的分布方式。

所以是的,您可以结合这两个索引,但您首先需要评估对性能的影响。


推荐阅读