想象一下,我们有这样的查询:
select a.col1, b.col2
from t1 a
inner join t2 b on a.col1 = b.col2
where a.col1 = 'abc'
col1
和col2
都没有任何索引。
如果我在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
列上的索引吗?
答案 0 :(得分:2)
使用id
上的索引做什么?
这里最昂贵的一点是连接列上的连接,而id
与此无关。
最有可能的情况是,没有区别。
可能的结果:它需要更多,因为它不会导致id
总是大于零,所以它使索引扫描找到正确的行,然后从中获得相同的它会从表扫描得到的行(如果有INCLUDE
覆盖有问题的列,则可能会有所不同。)
古怪的结果:嗯,在数据库优化的世界里发生了一些奇怪的事情,所以如果有帮助我就不会吃我的帽子,但我仍然会非常惊讶。
但实际上,强制与无关指数无关的工作对你的事业没有帮助。
编辑:实际上我想到了一个可以提供帮助的案例。在没有直接相关的情况下,SQLServer通常会使用一些索引进行搜索,因为即使在这种情况下,搜索通常也会比扫描更好。强迫寻求不同的索引可以只是可行地改进事物,如果由于某种原因寻求更好并且由于某种原因它选择了不同的寻求。不过我还是很惊讶。
答案 1 :(得分:1)
可能(但不太可能)。这完全取决于查询优化器评估查询的方式。更好的选择是使用提示。
答案 2 :(得分:1)
我认为实际情况会更糟。因为如果它在这里使用索引来检索所有行,那么与简单地检索所有行相比,这是额外的工作。
答案 3 :(得分:1)
问题的答案是肯定的,如果过滤掉表a中足够多的行,它可以提高性能。