【发布时间】:2015-07-15 13:26:31
【问题描述】:
我最近开始学习 oracle。我听说如果我们不遵循where 条件的顺序{特别是当我们加入两个或多个表时},将会出现一些性能问题(如果我错了请纠正我)在 SQL 查询中。如果是这种情况,应该遵循什么样的顺序,我应该考虑哪些因素。请在 general 中进行解释,对于以下场景,假设我有 3 张桌子。
请找到 DDL 和 Sample data here 。
表Part_material有基本信息,ID为Primary Key(PK),
表Component 将有不同类型的组件,其 ID,part_name 为 PK,每个 ID 将有 30 到 40 个条目,
表connection 将包含连接信息。我正在加入这三个表,如下所示:
select com.id,part.part_material,com.part_name,'TRUE',part.map_id,part.quantity,'INBOUND'
from Components com,Base_part part,connects rel
where part.id=com.id
and dbms_lob.compare(com.part_value,'Coat wi........')=0
and part.part_material in ('Barium','Tungston','Carbon')
and com.part_name='Build Material'
and rel.fromid=part.id
and rel.fromid=com.id
and rel.relname in ('Export Need','Not Molten');
如果我改变上述顺序,它会提高/降低性能吗?
【问题讨论】:
-
当优化器分析查询时,它会重新排序您的查询,如果它认为它会使您的查询更快,甚至可能重写它。所以不,我不希望您通过移动条件来看到性能上的任何差异(除非您通过这样做更改查询的语义含义)。但是你可以通过移动东西并比较解释计划来自己检查这一点。只需使用使其可读的顺序,以及为什么不使用 ANSI 连接。 :)
-
很有趣的问题。我只是猜测 MySQL 做了类似于short circuit evaluation 的事情,但后来我发现了this question。我猜想 WHERE 顺序会很重要(比较主键会更快),但是由于 SQL 的不同实现会在不同方向上迭代 where 子句,所以很难说更改顺序是否会影响性能。
-
@sstan:谢谢。好的,我会检查解释计划。是的,我将开始使用 ANSI 连接 :)
-
@DaveChen。谢谢你的链接 :)。那对我来说是新的。我从来不知道短路评估。