在 from 子句 *and* where 子句中添加连接条件使查询更快。为啥?
Posted
技术标签:
【中文标题】在 from 子句 *and* where 子句中添加连接条件使查询更快。为啥?【英文标题】:Adding a join condition in the from clause *and* where clause makes query faster. Why?在 from 子句 *and* where 子句中添加连接条件使查询更快。为什么? 【发布时间】:2017-01-26 15:04:32 【问题描述】:我正在为大型交易金融系统调整查询。我注意到,在 where 子句 以及 from 子句中包含连接条件会使查询的运行速度明显快于两者中的任何一个。我注意到 from 子句中的 join 有多个条件;我提到这一点以防它很重要。这是一个简化的示例:
SELECT *
FROM employee e
INNER JOIN car c ON c.id = e.car_id AND -- some other join
-- Adding the join above again, in the where clause makes the query faster
WHERE c.id = e.car_id;
我认为 ANSI 与老式相比纯粹是句法。怎么回事?
更新
分析了这两个执行计划后,很明显在 where 子句中添加与 from 子句相同的连接会产生与在两者中的任何一个中添加连接的非常不同的执行计划。
比较计划,我可以看到带有附加 where 子句条件的计划做得更好,并想知道为什么没有的计划以它的方式加入。知道了最佳计划,对连接条件的快速调整就解决了问题,尽管我仍然对两个查询没有编译成同一件事感到惊讶。黑魔法。
【问题讨论】:
看看解释计划会很有趣;你能把它们贴出来吗?另外,哪个 Oracle 版本? 是的,这很有趣。对于 SQL Server,它是纯语义的。 @Aleksej 恐怕我不能,我会违反工作中的安全政策。不过感谢您的帮助! 解释计划的“注释”部分是否有任何配置文件、大纲或 SQL 计划基线?更改查询的文本可能会阻止这些操作。 【参考方案1】:可能是 WHERE c.id = e.car_id 添加是一种控制表用于执行正确搜索的顺序的方法。 这可能是一种强制查询优化器将 where 条件中的表和与表相关的表用作主表的方法,因为表连接的顺序对于搜索不太有效,因为对于理解查询逻辑很有用
【讨论】:
我认为这就是正在发生的事情。将检查添加到 where 子句会更改执行计划中的连接顺序。我将尝试使用 ORDERED 提示,看看是否可以在没有重复条件的情况下获得相同的行为。 @RobertBain。试着让我知道......如果你的意思是写入连接的顺序,请记住我查询优化器在没有显式连接语法时受到影响的方式,并且所有表都是并排写入逗号分隔的..然后最正确的是命名铅表,因为在表扫描中首先是 evaluetedc .. 也可能是显式加入一个新的查询优化器这个概念丢失了,然后是 where 成瘾迫使这种行为.. 希望 di 评论有用.. scaisEdge,请参阅上面的更新。我没有确定的答案。 我认为就像我在上一条评论末尾所建议的那样 .. 连接序列不允许在查询优化器中找到前导表(更好的开始扫描查询)..并且连接中的 on 条件不会在查询优化器中添加信息...而是添加一个 where 条件为查询优化器评估引入了一个新元素 ..这会强制扫描盯着 qwith this ..以上是关于在 from 子句 *and* where 子句中添加连接条件使查询更快。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Oracle 查询中将连接从 Where 子句移动到 From 子句
简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server