DBMS_XPLAN不是故障,而是依赖的数据源缺失或权限不足:DISPLAY需PLAN_TABLE存在并授权,DISPLAY_CURSOR依赖共享池中未老化的游标,DISPLAY_AWR要求AWR已启用且快照存在。
不是 dbms_xplan 本身坏了,而是它依赖的执行计划数据没生成或没权限访问。
DBMS_XPLAN.DISPLAY 返回空或报错 ORA-00942
常见现象是执行 SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 后返回空结果集,或直接报 ORA-00942: table or view does not exist。这说明 PLAN_TABLE 对象缺失或不可见。
-
DBMS_XPLAN.DISPLAY默认从当前用户的PLAN_TABLE查询执行计划 —— 它不是内置视图,而是需要手动创建的普通表(或同义词) - 很多安装跳过了
$ORACLE_HOME/rdbms/admin/utlxplan.sql脚本,导致该表根本不存在 - 即使存在,如果用非 DBA 用户执行,可能没被授予
SELECT权限,或没建同义词指向公共PLAN_TABLE - 解决方法:以
sys或system登录,运行@?/rdbms/admin/utlxplan.sql;再对目标用户授SELECT权(如GRANT SELECT ON PLAN_TABLE TO your_user;)
DBMS_XPLAN.DISPLAY_CURSOR 查不到刚执行的 SQL
调用 DBMS_XPLAN.DISPLAY_CURSOR 却提示 “no rows selected”,不是函数失效,而是游标已老化或未启用捕获。
- 该函数查的是共享池中缓存的游标执行计划,只对最近执行、且未被老化淘汰的 SQL 生效
- 默认情况下,
STATISTICS_LEVEL参数为TYPICAL或BASIC时,部分统计信息(如SQL_PLAN)可能不完整 - 确保执行目标 SQL 时加了
/*+ GATHER_PLAN_STATISTICS */hint,或会话级开启:ALTER SESSION SET STATISTICS_LEVEL = 'ALL'; - 确认 SQL 还在共享池里:
SELECT sql_id, child_number FROM v$sql WHERE sql_text LIKE '%your_condition%';—— 查不到就说明已被刷出
DBMS_XPLAN.DISPLAY_AWR 报 ORA-13516 或找不到快照
执行 DBMS_XPLAN.DISPLAY_AWR 报错,多数情况不是包问题,而是 AWR 基础设施未就绪。
-
ORA-13516: AWR snapshot range is invalid表示指定的快照 ID 范围超出当前 AWR 保留期,或数据库未启用 AWR(比如 Standard Edition) - 检查 AWR 是否启用:
SELECT dbid, name, db_unique_name FROM v$database;+SELECT * FROM dba_hist_snapshot;—— 若后者无数据,说明 AWR 未收集 - Standard Edition 默认禁用 AWR 和自动快照;必须手动启用:
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();(需有ADMINISTER DATABASE TRIGGER权限) - 确认用户有
SELECT_CATALOG_ROLE或直接授予SELECT ANY DICTIONARY,否则查不到DBA_HIST_SQL_PLAN
真正容易被忽略的是:dbms_xplan 不是“开箱即用”的工具,它像一个读取器,而执行计划数据源(PLAN_TABLE、共享池、AWR)才是关键。没数据,再好的读取器也返回空。每次调用前,先确认数据在哪、有没有、能不能读——比反复查文档更省时间。


















