问题描述
假设我在一个表上有多个索引
假设我的索引名为index_a
,index_b
,index_c
查询为select * from myTable where columnA='var1'
那么如何才能从此查询中仅排除index_b
?
此处的目的是测试索引的影响。因此,我将在同一查询上运行两次查询。在第一个查询中,我将启用索引,在第二个查询中,我将禁用索引。因此,包含实际执行计划将向我显示它们与批处理查询成本的相对关系
我正在举个例子(实际情况要复杂得多)
解决方法
选项:
- 索引提示(多个索引提示不是一个好主意,请参见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 hints和query hints
的文档。禁用索引
要禁用索引:
ALTER INDEX index_b ON myTable
DISABLE;
要启用索引,请参见documentation