SQL加入类型和性能:跨越vs内部

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

INNER JOIN ON与WHERE子句

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

问题是这样的:

假定没有字段是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专家!


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


我认为大多数'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子句中。
  • “连接”搜索条件和“过滤器”连接条件之间的区别是主观的,但在实践中存在很多共识。

    PS你所谓的'交叉连接'不是:)正如你所说,这两个查询是等价的(如果你愿意,这两个查询都是'逻辑'内部连接),但不使用显式[INNER] JOIN语法的查询使用所谓的附加符号


    优化器对内连接标准的重新排序非常容易,并且应该很少有这样的机会 - 但如果统计数据过期,所有投注都关闭,它可能会重新排序它们首先使用具有不良统计数据的表格。 但是,即使您选择了订单,这当然也会影响您。

    至少在SQL Server中,优化器通常甚至可以通过视图和内联表值函数向下推内部联接条件,以便尽可能早地进行选择。

    链接地址: http://www.djcxy.com/p/15129.html

    上一篇: SQL Join Types and Performance: Cross vs Inner

    下一篇: INNER JOIN ON vs WHERE clause