首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 官方文档学习心得:RBO 驱动表选择规则实测验证

     編輯:Oracle 資料庫基礎

文档原文与质疑

「All things being equal RBO chooses the driving order by taking the tables in the FROM clause RIGHT to LEFT.」
—— Oracle 官方文档

笔者多次实测未能复现该规则,推测 RBO 内部仍存在隐含评分机制 (索引存在性、WHERE 条件过滤力等),并非单纯按 FROM 顺序倒序。

实测案例

建表与索引

CREATE TABLE A (COL1 NUMBER(4), COL2 NUMBER(4), COL4 CHAR(30));
CREATE TABLE B (COL1 NUMBER(4), COL3 NUMBER(4), NAME_B CHAR(30));
CREATE TABLE C (COL2 NUMBER(4), COL3 NUMBER(4), NAME_C CHAR(30));
CREATE INDEX INX_COL12A ON A(COL1, COL2);

查询语句

SELECT A.COL4
FROM B, A, C
WHERE B.COL3 = 10
  AND A.COL1 = B.COL1
  AND A.COL2 = C.COL2
  AND C.COL3 = 5;

观察结果

  • FROM 顺序:B → A → C (最右 C 按文档应为首选驱动表)。
  • 实际执行计划显示驱动表为 B (因 B.COL3 = 10 高选择性过滤)。
  • 若使用 Hint 强制 NL 则自动切换 CBO,无法在纯 RBO 下验证 Hint 干预。

结论与建议

  1. 官方文档关于 RBO 驱动表选择的描述过于简化,实测不符。
  2. RBO 早已废弃 (10g+ 移除),生产环境强制使用 CBO (OPTIMIZER_MODE=ALL_ROWS 或 FIRST_ROWS_n)。
  3. 学习文档时保持实证思维:EXPLAIN PLAN + DBMS_XPLAN.DISPLAY 验证每一条规则。
  4. 重点掌握 CBO 基数估算、直方图、动态采样、SQL Plan Management 等现代优化器核心机制。

一句话:文档是地图,实测是领土;优化器进化极快,唯有持续实验才能建立可靠心智模型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved