我只是想知道哪个加入会更快。
通常,表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'
感谢
答案 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
上只有一个索引,我希望预表达大致相同。