SQL Server不使用特定索引

时间:2019-06-19 14:38:57

标签: sql-server indexing

我有2种查询类型。第一个需要通过groupId和一些附加条件(需要多个索引)来获取一堆行,第二个需要通过id来获取行。但是,第一种查询使用的索引中没有groupId,需要一段时间。

此刻我禁用了(id,...)索引,但是我需要在某个时候重新打开它。

我的索引:

ix1_groupId_id2_id3_ival_iid
ix2_groupId_id3_id2_ival_iid
pk_id

我想写这样的东西:

SELECT id2, COUNT(*)
FROM table (WITHOUT(INDEX(pk_id))
WHERE groupId=x
GROUP BY id2

如何告诉SQL Server他将不使用pk_id索引?

1 个答案:

答案 0 :(得分:2)

SQL Server无法排除查询优化器考虑的索引。但是,您可以使用WITH关键字来指定所需的索引。例如,强制查询使用索引ix1_groupId_id2_id3_ival_iid

SELECT id2, COUNT(*)
FROM table (WITH(INDEX(ix1_groupId_id2_id3_ival_iid))
WHERE groupId=x
GROUP BY id2

在使用索引提示之前,我建议尝试了解为什么数据库不希望使用索引。可能是表很小,所以表扫描比索引查找要快。或者这些索引的统计信息可能已过时,因此对于优化器而言,使用主键似乎更快。

索引提示引入了模式上意外的代码依赖性。如果将来有人想更改索引名称,他们可能不会意识到此查询按名称请求索引,因此在使用新名称之前,查询将失败。