Oracle 杨廷琨 执行计划深度解析

Oracle 杨廷琨 执行计划深度解析

来源:杨廷琨 (AskTOM 中文 / 啖汤) 适用版本:Oracle Database 全版本 文档版本:v1.0 / 2026-07-22


1. 概述

执行计划是 SQL 优化的核心,杨廷琨有系列深度文章[1]。

详细见:Oracle 执行计划详解


2. 执行计划获取

2.1 EXPLAIN PLAN

EXPLAIN PLAN FOR 
SELECT * FROM emp WHERE deptno=10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

2.2 真实计划

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, 'ALLSTATS LAST'));

2.3 AWR 历史

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sql_id'));

2.4 杨廷琨推荐

- DISPLAY_CURSOR:真实
- ALLSTATS LAST:实际统计
- 比 EXPLAIN 准确

3. 关键字段

3.1 Operation

- 访问路径
- 表连接方式
- 操作类型

3.2 Rows

- 预估行数
- 基数
- 统计信息

3.3 Bytes

- 数据量
- 评估

3.4 Cost

- 成本
- CBO 评估
- 相对值

3.5 Time

- 预估时间
- 12c+

4. 访问路径

4.1 TABLE ACCESS FULL

- 全表扫描
- 多块读
- 高 HWM

4.2 INDEX RANGE SCAN

- 索引范围扫描
- 非唯一索引
- 等值/范围

4.3 INDEX UNIQUE SCAN

- 唯一索引
- 等值
- 最快

4.4 INDEX FAST FULL SCAN

- 索引快速全扫
- 多块读
- 不排序

4.5 INDEX FULL SCAN

- 索引全扫
- 单块读
- 排序

4.6 TABLE ACCESS BY INDEX ROWID

- 索引回表
- 单块读

5. 连接方式

5.1 Nested Loop Join

- 驱动表 → 被驱动表
- 索引访问
- 小数据 OLTP

5.2 Hash Join

- 构建哈希表
- 探测
- 大数据 OLAP

5.3 Merge Join

- 排序
- 合并
- 已排序数据

5.4 杨廷琨分析

- NL:小数据,索引
- HJ:大数据,内存
- MJ:特殊场景

6. 评估行数

6.1 基数

- 评估行数
- CBO 决策基础
- 统计信息

6.2 杨廷琨强调

- 评估不准 → 执行计划差
- 直方图
- 统计信息

6.3 查看

SELECT table_name, num_rows, last_analyzed 
FROM user_tables;

7. 统计信息

7.1 A-Rows vs E-Rows

- E-Rows:预估
- A-Rows:实际
- 差距大 → 统计信息问题

7.2 杨廷琨方法

- 对比 E/A
- 找出偏差
- 优化统计

8. Hint

8.1 常用

- /*+ INDEX */
- /*+ FULL */
- /*+ USE_NL */
- /*+ USE_HASH */
- /*+ PARALLEL */
- /*+ LEADING */

8.2 杨廷琨建议

- 谨慎使用
- 必要时使用
- 文档化
- 监控

9. 案例:全表扫描优化

9.1 现象

- TABLE ACCESS FULL
- 慢

9.2 分析

- 索引是否存在
- 统计信息
- CBO 选择

9.3 优化

- 创建索引
- 收集统计
- HINT(必要时)

10. 案例:连接方式不当

10.1 现象

- NL 连接大数据
- 性能差

10.2 优化

SELECT /*+ USE_HASH(e d) */ * 
FROM emp e, dept d WHERE e.deptno = d.deptno;

11. 案例:评估不准

11.1 现象

- E-Rows 1
- A-Rows 1000000
- 执行计划差

11.2 优化

EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP',
  CASCADE=>TRUE, METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');

12. 杨廷琨诊断方法

12.1 步骤

1. 获取真实执行计划
2. 看 Operation
3. 看 Rows (E/A)
4. 看 Cost
5. 找出问题
6. 优化

12.2 关注点

- 全表扫描
- 高 Cost
- E/A 差距
- 连接方式

13. 工具

13.1 DBMS_XPLAN

- DISPLAY
- DISPLAY_CURSOR
- DISPLAY_AWR

13.2 SQL Monitor

SELECT * FROM V$SQL_MONITOR WHERE sql_id='&sql_id';

13.3 杨廷琨推荐

- DISPLAY_CURSOR ALLSTATS LAST
- 真实数据

14. 最佳实践

  1. 真实计划:DISPLAY_CURSOR
  2. E/A 对比:偏差
  3. 统计信息:收集
  4. 索引:合理
  5. 连接方式:匹配数据量
  6. HINT:谨慎
  7. 监控:v$sql
  8. 测试:性能
  9. 文档:记录
  10. 学习:持续

15. 参考资料

[1] 杨廷琨, “执行计划深度解析”, https://www.modb.co/u/yangtingkun [2] Oracle Database SQL Tuning Guide 19c