Answers:
很多原因。
我能想到的最大的问题之一就是缺少索引DMV并没有考虑到现有索引。
例:
您有一张桌子ColA, ColB, ColC
。
目前,您在上有一个索引ColA
。缺少索引DMV将建议您在上添加索引(ColA, ColB)
。这可能是正确的,但明智的做法是ColB
在现有索引上添加第二个键。否则,您将有重复的覆盖范围,浪费空间和开销。
同样,如果您在上有一个索引ColB INCLUDE (ColA)
,则可能建议在上建立一个索引ColB INCLUDE (ColC)
。同样,明智的做法是将ColC
现有索引添加到包含列表中。
建议的索引视图非常狭窄-它们仅查看单个查询或单个查询中的单个操作。他们没有考虑已经存在的内容或您的其他查询模式。
您仍然需要一个有思想的人来分析总体索引策略,并确保索引结构高效且具有凝聚力。
如果仅添加所有建议的索引就没有问题,那么甚至没有必要提出建议-它们将自动实现。
duplicate index scripts
或类似工具,则有很多资源可以跟踪这些问题。我管理着大多数自己的索引,并且对此有所了解,但是我仍然会时不时地发现重复。
我建议谨慎使用此调优技术,因为随着查询和数据库模式变得越来越复杂,我发现查询计划弹出的缺少索引建议的可靠性始终不高。这是由于我的经验中的多种原因造成的:
1)除最简单的查询/最明显的索引外,“改善百分比”可能与所有方法相去甚远,毕竟,这只是估计值,而不是从查询运行时的实际成本或实际行数得出的。我已经看到实现建议的索引后查询成本会上升,或者甚至没有被使用并且计划保持不变。
2)查询计划本身不是最佳的,这可能是由于查询的结构(联接和where子句未优化等)引起的,还是由于缺少/过期的统计信息导致行计数估计值不正确。索引残酷的不良查询计划通常最多只能是一个临时解决方案,而只能在性能上有所提高。
3)您可能看不到整个图片。当仅使用图形计划而不查看XML以查看是否建议了多个缺失索引时,尤其如此。在图形计划中最先显示的那个不一定是对查询影响最大的那个。
4)在修改现有索引时,我还会遇到很多建议使用新索引的示例。关于这一点,请参见此处的其他答案,它们是正确的,无需我进一步阐述。
在处理不熟悉的查询/环境时,我只会使用缺少的索引建议作为起点,以了解在何处更深入。通过查看计划中的运算符(主要是查找/扫描/联接)并检查工具提示或属性窗口以查看涉及到的列,并使用其来确定候选索引来测试改进,我得到了更好的结果。
有很多原因,主要是-了解索引的工作方式和存储方式-您总是会创建更好的索引,或者至少-不会更糟,SSMS建议