我有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索引?
答案 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
在使用索引提示之前,我建议尝试了解为什么数据库不希望使用索引。可能是表很小,所以表扫描比索引查找要快。或者这些索引的统计信息可能已过时,因此对于优化器而言,使用主键似乎更快。
索引提示引入了模式上意外的代码依赖性。如果将来有人想更改索引名称,他们可能不会意识到此查询按名称请求索引,因此在使用新名称之前,查询将失败。