删除未使用的索引-评估意外的危险


16

根据DMV统计数据,我们有一个非常大的数据库,其中包含数百个未使用的索引,自从服务器在7月最后一次重新启动以来,该索引一直在累积。我们的一名DBA做出了以下警告性声明,这对我来说没有意义:

  1. 在删除索引之前,我们需要确定它是否不执行唯一性约束,因为查询优化器可能需要该索引存在。
  2. 每当创建索引时,都会在SQL Server中创建与该索引相关的统计信息。查询可能未使用索引,但可能正在使用其统计信息。因此,我们可能会遇到这样的情况:在删除索引之后,特定的查询性能会变得很差。SQL Server不保留统计信息的使用情况统计信息。尽管我们在数据库上启用了“自动创建统计信息”功能,但是我不知道在查询优化器创建丢失的统计信息之前必须在内部满足哪些所有参数。

关于#1,在我看来,SQL Server实际上会在完成插入/更新之前对索引进行一次搜索以确定唯一性,因此,该索引不会显示为未使用。

关于#2,这真的有可能吗?

顺便说一句,当我说不使用索引时,我的意思是没有搜寻也没有扫描。


3
当您绝对确定即使使用年终报告也不会使用该索引时,建议您禁用该索引。
Kin Shah

Answers:


17

您的DBA的关注点都是有效的。

关于#1,在我看来,SQL Server实际上会在完成插入/更新之前对索引进行一次搜索以确定唯一性,因此,该索引不会显示为未使用。

优化程序可以使用唯一性保证来确定可以使用哪些逻辑转换或物理操作来获取正确的结果。优化程序依赖于唯一性保证(例如,转换聚合或选择一对多合并联接)的事实将不会反映在索引使用统计信息中,除非最终执行计划中也对索引进行了物理访问。因此,在删除(或禁用)任何唯一索引或约束时应该非常小心。

关于#2,这真的有可能吗?

是的,优化程序可以使用与索引关联的统计信息,而无需最终执行计划来使用该索引进行任何访问。加载“有趣的”统计数据,计算基数估计以及生成完成的执行计划的过程是非常独立的活动。

删除索引还会删除关联的索引统计信息,这可能会在下次重新编译该语句时影响计划质量。索引统计信息可用于最终计划所依赖的基数估计计算中,即使最终计划中并不实际存在索引。

您的DBA知道他/她的东西。

所有这些都不应该表示绝对不应删除显然未使用的索引。我只是说您的DBA关注的问题是有效的,您应该相应地计划更改,并进行适当的测试和恢复计划。根据我的经验,第一点比第二点更有可能出现问题,但是我无法知道这是否适用于您的情况。

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.