我目前正在检查我们数据仓库中的所有索引作为性能调整练习。其中一些索引未在系统统计中使用,我正在考虑删除它们以减少批处理过程中的开销。
其中一些没有意义,因为 PK 列被用在其他索引的中间,等等。但是,我想知道 SQL Server 如何处理多列索引(具有重叠列)。
例子:
NONCLUSTERED INDEX Index1 (A, B, C)
NONCLUSTERED INDEX Index2 (A, B)
Run Code Online (Sandbox Code Playgroud)
SQL Server 是否能够将 Index1 用于与 Index2 和 Index2 不需要的行相同的行?我知道 rowID 包含在 B+tree 的叶级节点中,但是 C 的所有记录在 Index1 中都是有效的。
可以在不影响性能的情况下删除 Index2 吗?
据我所知,索引还可以帮助执行计划中的排序。Index1 也可以用于这些吗?
在一周内,我在批处理作业中遇到过几次糟糕的执行计划,为了避免强制执行计划,我继续添加本地连接提示(当这些连接类型是好的和坏的执行计划之间的区别时)。通过这种方式,我可以让 SQL Server 选择大部分计划,同时强制执行我知道的少数连接来完成查询。
在下面的执行计划中,我想强制连接类型有些相同,因此也会对这些使用本地连接提示。但是,我想知道我是否也能够触发执行计划中的其他操作,例如:
项目清单
这些操作是我可以选择的,还是取决于查询期间选择的连接类型/顺序?
这两个计划都是由从查询存储中提取的 XML 创建的。
好的执行计划:https : //www.brentozar.com/pastetheplan/?id=HyYMn7K2V
错误的执行计划:https : //www.brentozar.com/pastetheplan/?id=Hka6i7Yh4