强制使用索引可以提高性能吗?

时间:2012-08-29 15:37:08

标签: sql tsql

想象一下,我们有这样的查询:

select a.col1, b.col2
from t1 a
inner join t2 b on a.col1 = b.col2
where a.col1 = 'abc'

col1col2都没有任何索引。


如果我在where子句中添加另一个限制,那么一个总是正确的但是带有索引的列:

select a.col1, b.col2
from t1 a
inner join t2 b on a.col1 = b.col2
where a.col1 = 'abc'
and a.id >= 0  -- column always true and with index

可以使查询执行得更快,因为它可能会使用id列上的索引吗?

4 个答案:

答案 0 :(得分:2)

使用id上的索引做什么?

这里最昂贵的一点是连接列上的连接,而id与此无关。

最有可能的情况是,没有区别。

可能的结果:它需要更多,因为它不会导致id总是大于零,所以它使索引扫描找到正确的行,然后从中获得相同的它会从表扫描得到的行(如果有INCLUDE覆盖有问题的列,则可能会有所不同。)

古怪的结果:嗯,在数据库优化的世界里发生了一些奇怪的事情,所以如果有帮助我就不会吃我的帽子,但我仍然会非常惊讶。

但实际上,强制与无关指数无关的工作对你的事业没有帮助。

编辑:实际上我想到了一个可以提供帮助的案例。在没有直接相关的情况下,SQLServer通常会使用一些索引进行搜索,因为即使在这种情况下,搜索通常也会比扫描更好。强迫寻求不同的索引可以只是可行地改进事物,如果由于某种原因寻求更好并且由于某种原因它选择了不同的寻求。不过我还是很惊讶。

答案 1 :(得分:1)

可能(但不太可能)。这完全取决于查询优化器评估查询的方式。更好的选择是使用提示。

答案 2 :(得分:1)

我认为实际情况会更糟。因为如果它在这里使用索引来检索所有行,那么与简单地检索所有行相比,这是额外的工作。

答案 3 :(得分:1)

问题的答案是肯定的,如果过滤掉表a中足够多的行,它可以提高性能。