首页 文章

SQL Join类型和性能:Cross vs Inner

提问于
浏览
4

所以,我在这个网站上看到了很多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'

他们的执行时间有差异吗?我感兴趣的是 specifically ,在对 both 表中的值进行限制的情况下,除了ID匹配以关联像行一样 . 请注意,此架构中没有外键约束 .

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

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

3 回答

  • 2

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

  • 1

    我认为大多数“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'谓词;

    • 将'filter'谓词放在 WHERE 子句中 .

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

    附:您所谓的'cross join' isn 't :) As you say, the two queries are equivalent (both ' logical ' inner joins, if you will) but the one that doesn' t使用显式的 [INNER] JOIN 语法使用所谓的 infixed notation .

  • 3

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

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

相关问题