【问题标题】:Oracle SQL - Does the JOIN order in a FROM clause impact performance optimization?Oracle SQL - FROM 子句中的 JOIN 顺序会影响性能优化吗?
【发布时间】: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 顺序是否重要?

【问题讨论】:

    标签: oracle performance optimization sql-tuning


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2015-04-17
          • 1970-01-01
          • 2011-05-01
          • 2017-03-22
          • 2018-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多