0

假设我们有这样的查询:

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

4 回答 4

2

使用索引id来做什么?

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

最有可能的情况,它没有任何区别。

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

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

但实际上,用不相关的索引强迫不相关的工作对你的事业没有帮助。

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

于 2012-08-29T15:42:26.660 回答
1

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

于 2012-08-29T15:40:39.077 回答
1

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

于 2012-08-29T15:42:35.913 回答
1

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

于 2012-08-29T15:45:45.177 回答