小伙伴们,有没有经常和开发一起定位sql查询和分析性能问题,经常拿到一串sql进行先做个EXPLAIN,EXPLAIN PLAN作为Oracle数据库提供的一种用于分析SQL语句执行计划的工具,运行后,其实不会真的执行SQL语句而是通过模拟优化器生成执行计划,同时生成的执行计划被写入一个特定的表(默认为PLAN_TABLE,如果没有,实需使用utlxpan的sql新建,实操中有脚本)
第三方DATAGRIP,PL/SQL,Navicat等各种工具,一键EXPLAIN PLAN,同样查询PLAN_TABLE表来了解SQL语句的执行路径,Oracle执行了哪些,信息保存在哪里,API调用是否可行。
一、工作原理与技术要点
核心原理
- 静态分析:仅生成执行计划而不实际执行SQL(规避DDL/DML影响,模拟操作不真实运行,考量真实效果和EXPLAIN可能会有出入)
- 数据存储:使用全局临时表PLAN_TABLE$(ON COMMIT PRESERVE ROWS设计)
- 会话隔离:每个会话只能访问自己生成的执行计划
- 依赖统计信息:准确性取决于表/索引统计信息(行数、直方图等)
关键技术点
- 存储表结构:全局临时表(含Operation/Cost/Rows/Predicate等核心字段)
- 权限要求:SELECT ANY TABLE + CREATE SESSION
- 输出解读:
- Id:执行步骤编号(树形结构)
- Operation:关键操作类型(TABLE ACCESS FULL/INDEX RANGE SCAN等)
- Rows:优化器估算行数(统计信息决定)
- Cost:相对执行成本(CPU+IO权重)
二、 生成执行计划的过程
- USER执行EXPLAIN PLAN FOR 。
- Oracle解析SQL语句,优化器基于当前的统计信息生成执行计划。
- 将执行计划的每一步骤插入到PLAN_TABLE$(或用户指定的表)中。
- 用户通过查询TABLE(DBMS_XPLAN.DISPLAY)或直接查询PLAN_TABLE来查看执行计划。
2.1 底层流程
命令解析
:
- 用户执行EXPLAIN PLAN FOR [SQL语句]
- Oracle解析器验证SQL语法和语义正确性
优化器工作
:
- 优化器基于统计信息、系统参数和SQL结构
- 生成多个候选执行计划并计算成本估值
- 选择成本最低的执行计划方案
计划存储
:
- 将执行计划分解为操作步骤(Operation)
- 逐行写入全局临时表PLAN_TABLE$
- 每行包含:操作ID、父ID

最低0.47元/天 解锁文章
1386

被折叠的 条评论
为什么被折叠?



