盲目添加丢失的索引可以吗?


21

我经常使用SSMS来测试慢速存储过程中是否缺少索引。每当我看到“缺少索引(影响xxx)”时,我的下肢反应就是创建新索引。据我所知,每次查询都会更快。

为什么我不应该继续这样做呢?


1
您能告诉我从哪里可以得到此缺失的索引功能。
Ali Raza Iftikhar

Answers:


27

很多原因。

我能想到的最大的问题之一就是缺少索引DMV并没有考虑到现有索引。

例:

您有一张桌子ColA, ColB, ColC

目前,您在上有一个索引ColA。缺少索引DMV将建议您在上添加索引(ColA, ColB)。这可能是正确的,但明智的做法是ColB在现有索引上添加第二个键。否则,您将有重复的覆盖范围,浪费空间和开销。

同样,如果您在上有一个索引ColB INCLUDE (ColA),则可能建议在上建立一个索引ColB INCLUDE (ColC)。同样,明智的做法是将ColC现有索引添加到包含列表中。

建议的索引视图非常狭窄-它们仅查看单个查询或单个查询中的单个操作。他们没有考虑已经存在的内容或您的其他查询模式。

您仍然需要一个有思想的人来分析总体索引策略,并确保索引结构高效且具有凝聚力。

如果仅添加所有建议的索引就没有问题,那么甚至没有必要提出建议-它们将自动实现。


我知道,也许这就是感觉我拥有庞大的索引的原因。我想我应该尝试更好地理解这些解释计划并手动找出索引。
2012年

如果您使用Google duplicate index scripts或类似工具,则有很多资源可以跟踪这些问题。我管理着大多数自己的索引,并且对此有所了解,但是我仍然会时不时地发现重复。
JNK 2012年

“您仍然需要一个有思想的人来分析整体索引策略,并确保索引结构高效且具有凝聚力。” +1!作为顾问,我在各种各样的情况下都有各种各样的客户。有时,我之所以得到这些客户端,是因为它们的索引过多(错误的索引,冗余的索引等等)-所有这些都是数据库引擎优化顾问建议的。
Mike Walsh 2012年

@JNK-我会的。
2012年

2
重点-索引重叠绝对是这里需要注意的最大事情。而且你当然有更多的指标,插入变得越慢,再加上命中可维护性(增加复杂性),等
杰夫·阿特伍德

8

我建议谨慎使用此调优技术,因为随着查询和数据库模式变得越来越复杂,我发现查询计划弹出的缺少索引建议的可靠性始终不高。这是由于我的经验中的多种原因造成的:

1)除最简单的查询/最明显的索引外,“改善百分比”可能与所有方法相去甚远,毕竟,这只是估计值,而不是从查询运行时的实际成本或实际行数得出的。我已经看到实现建议的索引后查询成本会上升,或者甚至没有被使用并且计划保持不变。

2)查询计划本身不是最佳的,这可能是由于查询的结构(联接和where子句未优化等)引起的,还是由于缺少/过期的统计信息导致行计数估计值不正确。索引残酷的不良查询计划通常最多只能是一个临时解决方案,而只能在性能上有所提高。

3)您可能看不到整个图片。当仅使用图形计划而不查看XML以查看是否建议了多个缺失索引时,尤其如此。在图形计划中最先显示的那个不一定是对查询影响最大的那个。

4)在修改现有索引时,我还会遇到很多建议使用新索引的示例。关于这一点,请参见此处的其他答案,它们是正确的,无需我进一步阐述。

在处理不熟悉的查询/环境时,我只会使用缺少的索引建议作为起点,以了解在何处更深入。通过查看计划中的运算符(主要是查找/扫描/联接)并检查工具提示或属性窗口以查看涉及到的列,并使用其来确定候选索引来测试改进,我得到了更好的结果。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.