sql中“inner join”和“where”的操作顺序

Posted

技术标签:

【中文标题】sql中“inner join”和“where”的操作顺序【英文标题】:Order of operations in sql for "inner join" and "where" 【发布时间】:2016-02-12 09:58:26 【问题描述】:

我有一个看起来像这样的查询

select * from t1 inner join t2 on t1.c1 = t2.c1
                 inner join t3 on t2.c2 = t3.c2
                 inner join t4 on t3.c3 = t4.c3
                 where t3.c4 = value

我很想知道操作的顺序是什么:

(1) 将执行所有内部连接,然后选择具有t3.c4 = value 的列

(2) 不是使用 t3 进行连接,而是实际上(首先)使用具有 t3.c4 = value 的表完成连接。即首先将创建带有t3.c4 = value 的临时表(t3tmp),然后将执行所有内部连接,而不是使用t3 t3tmp

【问题讨论】:

逻辑上,JOIN 链是从左到右执行的,然后应用 WHERE。但是,dbms 优化器可能会选择完全不同的顺序来执行查询。 请标记您正在使用的 DBMS,因为答案可能会有所不同。 SQL 语言是设计的,以便您告诉系统做什么,而不是如何做,然后优化器的工作就是弄清楚如何最好地做到这一点,应用过滤器/连接/等的顺序。如果您想知道特定数据库引擎如何处理此问题,请为该产品添加标签,但请注意,答案可能很容易仍然是“视情况而定” 【参考方案1】:

考虑在 DataFrame 上使用 explain 方法或查看 Spark UI,以获取有关如何优化您的特定案例的更多信息。


传递连接谓词的下推

应该是 Spark 1.6 的第二个选项(虽然它可能取决于条件本身)。

t3.c4 条件很可能会在加入之前被推送到 t3 结果中。 有关 Spark 如何处理它的更多信息,请参阅 SPARK-12532 Jira 票证和相关的 pull request。

编辑 #1

上面说的改动好像被延迟了,没有合并到1.6中。

加入重新排序

关于join的顺序,据我所知,有计划添加一个基于成本的优化器来实际规划应该先执行哪个join,但还没有实现。

此时,我只能找到这张 SPARK-12602 Jira 票证,其中提到了外部/内部连接重新排序(还有一些其他票证以及其他情况)。

【讨论】:

以上是关于sql中“inner join”和“where”的操作顺序的主要内容,如果未能解决你的问题,请参考以下文章

带有 INNER JOIN 和 WHERE 的 SQL 查询

在 SQL ACCESS 中使用 LEFT 或 INNER JOIN 和 WHERE 的问题

SQL: LEFT JOIN , RIGHT JOIN , INNER JOIN 区别 , on 和 where条件的区别

SQL left joinright join和inner join的区别以及where的搭配使用

sql中 INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN 中 ON与Where的区别

sql中 INNER JOIN LEFT JOIN RIGHT JOIN FULL JOIN 中 ON与Where的区别