【问题标题】:which join goes faster: 1 key+ hard coded vs 2 key哪个连接更快:1 键 + 硬编码 vs 2 键
【发布时间】:2014-12-04 18:35:40
【问题描述】:

我只是想知道哪个 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'

谢谢

【问题讨论】:

  • 你为什么不检查一下执行计划......?话虽如此,我认为它们都是一样的。
  • 选择查看执行计划

标签: sql sql-server join left-join


【解决方案1】:

这两个查询语义上不等价

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

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

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

...这与大多数 RDBMS 中的执行计划相同。

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

【讨论】:

    【解决方案2】:

    唯一确定的判断方法是尝试两种方法并测量它们。 IT 将取决于可用的索引以及优化器决定使用它们的方式。

    如果每个表的(key1, key2) 上都有一个复合索引,我希望如果有任何差异,联接+过滤器会更快。如果key1 上只有一个索引,我希望性能大致相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-20
      • 2017-11-01
      • 2011-11-11
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多