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的区别