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. 最佳实践
- 真实计划:DISPLAY_CURSOR
- E/A 对比:偏差
- 统计信息:收集
- 索引:合理
- 连接方式:匹配数据量
- HINT:谨慎
- 监控:v$sql
- 测试:性能
- 文档:记录
- 学习:持续
15. 参考资料
[1] 杨廷琨, “执行计划深度解析”, https://www.modb.co/u/yangtingkun [2] Oracle Database SQL Tuning Guide 19c