SQL Join类型和性能:Cross vs Inner

时间:2010-07-15 03:35:55

标签: sql performance

所以,我在这个网站上看到了很多SQL示例。我有一个关于内连接(普通JOIN)和交叉连接(SELECT foo FROM bar,baz WHERE)的相对性能的问题。结果问题已经被问到:

INNER JOIN ON vs WHERE clause

但我还有一个问题需要澄清。我在答案中没有看到任何内容。

问题是:

假设没有字段为NULL。给出两个等价查询,其中一个是这样的:

SELECT * FROM t1
JOIN t2 ON t1.t2_id=t2.t1_id AND t2.bar='baz'
WHERE t1.foo='bar'

其中一个格式如下:

SELECT * FROM t1,t2
WHERE t1.foo='bar' AND t1.t2_id=t2.t1_id AND t2.bar='baz'

执行时间有差异吗?在对两个表中的值进行限制的情况下,我感兴趣具体,此外还有ID匹配以关联相似的行。请注意,此架构中没有外键约束。

我可能还应该说,我对如何扩展到两个以上的表感兴趣。

预先感谢您的答案,SQL专家!

3 个答案:

答案 0 :(得分:3)

您的第一个示例通常称为显式连接,第二个示例是隐式连接。在性能方面,它们应该是等效的,至少在流行的DBMS中是这样。

答案 1 :(得分:2)

我认为大多数“SQL专家”会更像这样编写查询:

SELECT * 
  FROM t1
       INNER JOIN t2 
         ON t1.t2_id = t2.t1_id 
 WHERE t1.foo='bar'
       AND t2.bar = 'baz';

具体做法是:

  • 强烈偏好INNER JOIN语法(尽管可以选择 省略INNER关键字);
  • 只放入'join'谓词 JOIN条款;
  • 将'过滤器'谓词放入 WHERE条款。

“加入”搜索条件和“过滤器”加入条件之间的区别是主观的,但是从业者之间存在很多共识。

P.S。你所谓的'交叉连接'不是:)正如你所说,这两个查询是等价的(两个'逻辑'内连接,如果你愿意)但是那个不使用显式[INNER] JOIN语法的查询使用所谓的固定符号

答案 2 :(得分:1)

对于优化器来说,内部连接标准的重新排序非常容易,并且应该很少有机会弄乱它 - 但如果统计数据已经过时,所有投注都会关闭,它可能会重新进行命令他们首先使用具有错误统计信息的表。但是,即使您选择了订单,当然也可能会影响您。

至少在SQL Server中,优化器通常甚至可以通过视图和内联表值函数向下推送内连接条件,以便它们尽可能高度选择。