在Oracle数据库中进行SQL性能分析时,很多用户习惯使用explain plan命令查看执行计划,但这种方式生成的是优化器的预估结果,没有考虑实际运行时的绑定变量值、系统资源状态等因素,和SQL真实执行的情况可能存在明显差异。想要准确分析SQL性能问题,需要获取SQL的真实执行计划。

通过dbms_xplan查看当前游标中的真实执行计划
当SQL刚执行完还在共享池中时,可以通过v$sql、v$sql_plan等动态性能视图结合dbms_xplan包获取真实执行计划,这种方式能反映SQL实际运行时的执行路径。
操作步骤
- 先执行要分析的SQL语句,确保SQL已经进入共享池
- 查询
v$sql视图获取目标SQL的sql_id和child_number - 使用
dbms_xplan.display_cursor函数输出真实执行计划
示例代码
-- 先执行目标SQL
SELECT * FROM emp WHERE deptno = 10;
-- 查询刚执行SQL的sql_id和child_number
SELECT sql_id, child_number, sql_text
FROM v$sql
WHERE sql_text LIKE 'SELECT * FROM emp WHERE deptno = 10%'
AND sql_text NOT LIKE '%v$sql%';
-- 替换上面的sql_id和child_number,查看真实执行计划
SELECT * FROM TABLE(dbms_xplan.display_cursor('替换为sql_id', 替换为child_number, 'ALLSTATS LAST'));输出的执行计划中会包含实际返回行数、实际耗时等运行时的统计信息,比预估计划更有参考价值。
查看历史SQL的真实执行计划
如果SQL已经不在共享池中,但是之前被AWR采集过,可以通过dbms_xplan.display_awr函数查看历史SQL的真实执行计划。
操作步骤
- 查询
dba_hist_sqltext视图获取目标SQL的sql_id - 使用
dbms_xplan.display_awr函数输出该SQL的历史执行计划
示例代码
-- 查询历史SQL的sql_id
SELECT sql_id, sql_text
FROM dba_hist_sqltext
WHERE sql_text LIKE 'SELECT * FROM emp WHERE deptno = 10%'
AND sql_text NOT LIKE '%dba_hist_sqltext%';
-- 替换sql_id查看历史真实执行计划
SELECT * FROM TABLE(dbms_xplan.display_awr('替换为sql_id'));这种方式适合分析之前出现过的性能问题SQL,不需要SQL当前还在运行。
通过SQL Trace获取真实执行计划
开启SQL Trace后,Oracle会记录SQL执行的详细信息,包括真实的执行计划,这种方式还能获取更详细的执行过程中的等待事件和资源消耗信息。
操作步骤
- 为当前会话开启SQL Trace
- 执行要分析的SQL
- 关闭SQL Trace
- 使用tkprof工具格式化trace文件,查看真实执行计划
示例代码
-- 开启当前会话的SQL Trace ALTER SESSION SET sql_trace = TRUE; -- 执行目标SQL SELECT * FROM emp WHERE deptno = 10; -- 关闭SQL Trace ALTER SESSION SET sql_trace = FALSE; -- 查询生成的trace文件路径 SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
拿到trace文件路径后,在服务器上使用tkprof工具格式化文件,格式化后的文件中会包含SQL的真实执行计划和运行统计信息。
不同方式对比
可以根据实际场景选择合适的方式查看真实执行计划,以下是几种方式的对比:
| 查看方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| dbms_xplan.display_cursor | SQL刚执行完,还在共享池中 | 操作简便,能获取实时运行统计信息 | SQL不在共享池时无法使用 |
| dbms_xplan.display_awr | SQL已被AWR采集,不在共享池 | 可以查看历史SQL的执行计划 | 只能看到AWR采集周期内的信息,不够实时 |
| SQL Trace + tkprof | 需要详细执行过程和资源消耗信息 | 信息最全面,包含等待事件等细节 | 操作步骤较多,需要服务器文件访问权限 |
在实际优化工作中,优先使用dbms_xplan.display_cursor方式,它能快速拿到最准确的实时执行计划,满足大部分场景的需求。如果碰到历史性能问题,再结合AWR的方式分析,需要深度排查时再使用SQL Trace。
OracleSQL执行计划dbms_xplanEXPLAIN PLANSQL优化修改时间:2026-06-02 17:30:05