sql-server - 两个非聚集索引在 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 上?
解决方案
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 中值的分布方式。
所以是的,您可以结合这两个索引,但您首先需要评估对性能的影响。
推荐阅读
- ios - 如何从设置中快速读取单声道音频值
- python - 无法使用 MingW 在 Windows 上编译 Cython
- yii - Yii 框架未在菜单数组上显示图像链接
- struts - 使用 struts 上传文件的 Dropzone
- php - 在多维数组中合并和计数
- macos - 如何在 x86 程序集中获取长字符串的长度以在断言上打印
- vuejs2 - 基于布尔值禁用 nuxt 链接
- c# - FromSql 导致错误,而查询在 pgAdmin 中工作
- php - Wordpress - 如何在每一页上显示标题?
- php - 国家、州和城市名称显示第一个表中的正确名称,但也显示第二个表的相同详细信息