| 方法 | 是否执行 SQL | 输出内容 | 适用场景 |
|---|---|---|---|
| AUTOTRACE TRACEONLY | 否 | 计划 + 统计信息 (估算) | 已知慢 SQL 快速诊断 |
| EXPLAIN PLAN | 否 | 仅计划 (存 PLAN_TABLE) | 开发期静态分析、工具集成 |
| DBMS_SYSTEM / 10046 Trace | 是 | 实际执行计划 + 逐阶段资源消耗 | 生产环境会话级深度诊断 |
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT * FROM EMP WHERE DEPTNO = 10;
-- 仅显示计划,不执行,不等待
SET AUTOTRACE TRACEONLY STATISTICS
SELECT * FROM EMP WHERE DEPTNO = 10;
-- 执行并显示统计 (recursive calls, db block gets, consistent gets, physical reads 等)
前置准备:
@?/rdbms/admin/utlxplan.sql 建立 PLAN_TABLE (或使用公共同义词)。PLUSTRACE 角色 (由 @?/sqlplus/admin/plustrce.sql 授予)。-- 1. 确保 PLAN_TABLE 存在
@?/rdbms/admin/utlxplan.sql
-- 2. 生成计划
EXPLAIN PLAN SET STATEMENT_ID = 'MY_QUERY_01' FOR
SELECT E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;
-- 3. 格式化输出 (Oracle 10g+ 推荐)
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', 'MY_QUERY_01', 'TYPICAL'));
优势:计划持久化在 PLAN_TABLE,便于版本对比、工具解析。
-- 目标会话 SID=123, SERIAL#=456
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(123, 456, TRUE);
-- 等待业务跑完
EXEC SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(123, 456, FALSE);
-- 定位 trace 文件 (USER_DUMP_DEST)
-- 格式化
TKPROF ORCL_ora_12345.trc OUTPUT.TXT EXPLAIN=USER/PASS SYS=NO SORT=PRSLA,EXELA,FCHLA
输出含:Parse/Execute/Fetch 各阶段 CPU、Elapsed、Disk、Query、Current、Rows 等完整资源画像,唯一能看到实际执行计划 (非估算) 的方法。
SET AUTOTRACE TRACEONLY EXPLAIN 秒级反馈。EXPLAIN PLAN + DBMS_XPLAN.DISPLAY 归档计划。DBA_HIST_SQLSTAT + DBMS_XPLAN.DISPLAY_AWR (需 Diagnostic Pack)。