Oracle SQL - FROM 子句中的 JOIN 顺序会影响性能优化吗?

Posted

技术标签:

【中文标题】Oracle SQL - FROM 子句中的 JOIN 顺序会影响性能优化吗?【英文标题】:Oracle SQL - Does the JOIN order in a FROM clause impact performance optimization? 【发布时间】:2020-04-28 17:43:33 【问题描述】:

很久以前,我曾在 SQL 课程中被告知,查询的 FROM 子句中的 JOIN 顺序会影响查询的性能。因此,例如,如果我有以下内容

SELECT * FROM 
TABLE_1 INNER JOIN --5000 rows
TABLE_2 ON TABLE_1.COL1=TABLE_2.COL1 INNER JOIN --200 rows
TABLE_3 ON TABLE_2.COL1=TABLE_3.COL1--50 rows
.....

这应该重新排序为以下

SELECT * FROM 
TABLE_3 INNER JOIN --50 rows
TABLE_2 ON TABLE_2.COL1=TABLE_3.COL1 INNER JOIN --200 rows
TABLE_1 ON TABLE_1.COL1=TABLE_2.COL1 --5000 rows
.....

因此,前导/驱动表首先是行数最少的(假设)。我已经读过,除非使用 HINT 来强制执行订单,否则 Oracle 中基于成本的优化器只会按照它认为合适的方式重新安排 JOIN。

只是好奇,在 SQL 语句中不使用 HINTS 的 JOIN 顺序是否重要?

【问题讨论】:

【参考方案1】:

确实,很久以前在使用 RBO(基于规则的优化器)时产生了影响。

在现代 Oracle 版本中,CBO(基于成本的优化器)选择最佳执行计划并为您完成这项工作 - 不,您不必再对表重新排序。

【讨论】:

【参考方案2】:

在 SQL 语句中不使用 HINTS 的 JOIN 顺序是否重要?

没有。这是数据库的基本优化;优化器将决定加入表的最佳策略,无论它们在from 子句中出现的顺序如何。

【讨论】:

【参考方案3】:

oracle 优化器组件“查询转换器”转换您的查询,如果需要,它会根据可用的统计信息自动执行此操作,当它发现您需要转换时。

【讨论】:

以上是关于Oracle SQL - FROM 子句中的 JOIN 顺序会影响性能优化吗?的主要内容,如果未能解决你的问题,请参考以下文章

FROM中的子查询不在Oracle SQL中工作

Oracle SQL性能优化

[Oracle]Oracle良性SQL建议

Oracle SQL性能优化

Oracle SQL性能优化

Oracle Sql效率优化