如何在给定查询中排除某些索引以查看该索引的影响 索引提示禁用索引

问题描述

假设我在一个表上有多个索引

我想在执行查询时仅排除其中的一个

假设我的索引名为index_aindex_bindex_c

查询select * from myTable where columnA='var1'

那么如何才能从此查询中仅排除index_b

此处的目的是测试索引的影响。因此,我将在同一查询上运行两次查询。在第一个查询中,我将启用索引,在第二个查询中,我将禁用索引。因此,包含实际执行计划将向我显示它们与批处理查询成本的相对关系

我正在举个例子(实际情况要复杂得多)

enter image description here

解决方法

选项:

  • 索引提示(多个索引提示不是一个好主意,请参见link
  • 禁用索引
  • 删除索引(不建议将其用于测试,它可能是一个大表,需要一些时间来重新创建索引)
  • 复制架构和数据,但要排除的索引除外。 (相关性不高,因为新创建的索引的统计信息会有所不同)

索引提示

您可以尝试使用特定索引执行查询以测试差异:

select * 
from myTable WITH (INDEX(index_a)) -- or index_b or index_c
where columnA='var1'

或具有多个提示:

select * 
from myTable WITH (INDEX(index_a,index_c)) -- Bad idea,only for testing.
where columnA='var1'

您还可以在JOIN上指定索引提示,请参见table hintsquery hints

的文档。

禁用索引

要禁用索引:

ALTER INDEX index_b ON myTable   
DISABLE;

要启用索引,请参见documentation