Oracle如何查看sql的真实执行计划

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《Oracle如何查看sql的真实执行计划》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Oracle如何查看sql的真实执行计划》有用,将其分享出去将是对创作者最好的鼓励。

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

Oracle如何查看sql的真实执行计划

通过dbms_xplan查看当前游标中的真实执行计划

当SQL刚执行完还在共享池中时,可以通过v$sqlv$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_cursorSQL刚执行完,还在共享池中操作简便,能获取实时运行统计信息SQL不在共享池时无法使用
dbms_xplan.display_awrSQL已被AWR采集,不在共享池可以查看历史SQL的执行计划只能看到AWR采集周期内的信息,不够实时
SQL Trace + tkprof需要详细执行过程和资源消耗信息信息最全面,包含等待事件等细节操作步骤较多,需要服务器文件访问权限

在实际优化工作中,优先使用dbms_xplan.display_cursor方式,它能快速拿到最准确的实时执行计划,满足大部分场景的需求。如果碰到历史性能问题,再结合AWR的方式分析,需要深度排查时再使用SQL Trace。

OracleSQL执行计划dbms_xplanEXPLAIN PLANSQL优化修改时间:2026-06-02 17:30:05

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。