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 顺序会影响性能优化吗?的主要内容,如果未能解决你的问题,请参考以下文章