哪个连接速度更快:1键+硬编码vs 2键

时间:2014-12-04 18:35:41

标签: sql sql-server join left-join

我只是想知道哪个加入会更快。

通常,表A的2个键列连接到表B的2个键列,所有列都被编入索引。

基于百万行级别的两个表。

应该是这样的:

select * 
from  A 
left join B 
on  A.key1=B.key1
and A.key2=B.key2
..............
..............

但如果我想要key2处的特定键值,key2='AA'会更快:

计划A:

select * 
from  A 
left join B 
on  A.key1=B.key1
and A.key2=B.key2
where A.key2='AA'

B计划:

select * 
from  A 
left join B 
on  A.key1=B.key1
where A.key2='AA' and B.key2='AA'

感谢

2 个答案:

答案 0 :(得分:1)

这两个查询非语义上等同

当您将LEFT JOIN ed表中的列放入WHERE子句时,将其设为INNER JOIN。如果B中没有匹配的记录,您将无法从A获取记录。

您的选择是在WHERE子句中使用它,就像您在第一个选项中一样,或者将其放入JOIN

left join B 
on  A.key1=B.key1
AND a.Key1 = 'AA'

...这在大多数RDBMS中都是相同的执行计划。

作为可读性的规则,您希望在WHERE子句中使用它,因为这是下一个人寻找过滤器的地方。

答案 1 :(得分:0)

电话的唯一明确方式是两种方式尝试并衡量它们。 IT将取决于可用的索引以及优化程序如何决定使用它们。

如果每个表上的(key1, key2)上都有一个复合索引,我认为如果有任何差异,加入+过滤器会更快。如果key1上只有一个索引,我希望预表达大致相同。