上一篇说到了autotrace,SQL调试时候的获取性能和参数数据,直接用上trace,还有个更全能的工具10046。是不是很多小伙伴会对这么个数字,觉得起名很奇怪,数字起名任性。“10046”本质是Oracle内核事件的随机性技术编号,类似于软件中的错误代码,Oracle开发团队设计,数字本身并无特殊含义,而是用于在代码层唯一标识特定功能模块或诊断事件。
跟踪级别 |
功能描述 |
适用场景 |
Level 1 |
SQL基础统计+执行计划 |
常规性能分析 |
Level 4 |
Level 1 + 绑定变量值 |
绑定变量相关性能问题 |
Level 8 |
Level 1 + 等待事件 |
资源争用分析 |
Level 12 |
Level 1+4+8的综合 |
复杂性能问题诊断 |
Level 16 |
每次执行的详细统计 |
多次执行场景分析 |
Level 32 |
Level 1排除执行计划 |
减少跟踪文件大小 |
Level 64 |
自适应执行计划生成 |
执行计划突变分析 |
-- 9i环境设置
ALTER SESSION SET timed_statistics = TRUE;
ALTER SESSION SET max_dump_file_size = unlimited;
ALTER SESSION SET events '10046 trace name context forever, level 8';
-- 执行待跟踪SQL
SELECT /*+ ALL_ROWS */ * FROM scott.emp WHERE deptno = 20;
-- 关闭跟踪
ALTER SESSION SET events '10046 trace name context off';
10g版本对10046事件进行了重要改进,特别是在执行计划处理机制上。最显著的增强是引入了执行计划自动写入功能,但此功能仅当相关游标关闭时才触发,且执行统计信息是该游标所有执行次数的累计数据。这一特性使得分析多次执行的SQL语句变得困难,因为无法区分单次执行的资源消耗。10g还增强了跟踪文件的可管理性,通过tracefile_identifier参数允许用户自定义跟踪文件标识,大大简化了文件识别过程。然而在文件存储结构上,10g仍沿用了9i的双目录设计,尚未引入统一的诊断目录。
-- 10g环境设置
ALTER SESSION SET tracefile_identifier = '10g_trace_level8';
ALTER SESSION SET events '10046 trace name context forever, level 8';
-- 执行待跟踪SQL(多次执行)
BEGIN
FOR i IN 1..5 LOOP
EXECUTE IMMEDIATE 'SELECT /*+ 10g_trace */ * FROM scott.emp WHERE sal > :1' USING i*500;
END LOOP;
END;
/
-- 关闭跟踪
ALTER SESSION SET events '10046 trace name context off';
-- 11g环境设置
ALTER SESSION SET tracefile_identifier = '11g_trace_level16';
ALTER SESSION SET events '10046 trace name context forever, level 16';
-- 获取跟踪文件路径
SELECT value AS trace_file FROM v$diag_info WHERE name = 'Default Trace File';
-- 执行待跟踪SQL(多次执行)
BEGIN
FOR i IN 1..3 LOOP
EXECUTE IMMEDIATE 'SELECT /*+ 11g_level16 */ * FROM scott.dept WHERE deptno = :1' USING i*10;
END LOOP;
END;
/
-- 关闭跟踪
ALTER SESSION SET events '10046 trace name context off';
-- 12c+~ PDB环境设置
ALTER SESSION SET container = FREEPDB1;
ALTER SESSION SET tracefile_identifier = 'pdb_trace_level12';
ALTER SESSION SET events '10046 trace name context forever, level 12';
-- 执行待跟踪SQL(使用自适应特性)
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('19.3') */ e.FIRST_NAME, d.DEPARTMENT_NAME
FROM HR.EMPLOYEES e JOIN HR.DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.SALARY > 1500;
-- 关闭跟踪
ALTER SESSION SET events '10046 trace name context off';
--
SYS@CDB$ROOT> ALTER SESSION SET container = FREEPDB1;
Session altered.
SYS@CDB$ROOT> ALTER SESSION SET tracefile_identifier = 'pdb_trace_level12';
Session altered.
SYS@CDB$ROOT> ALTER SESSION SET events '10046 trace name context forever, level 12';
Session altered.
SYS@CDB$ROOT> SELECT /*+ OPTIMIZER_FEATURES_ENABLE('19.3') */ e.FIRST_NAME, d.DEPARTMENT_NAME
2 FROM HR.EMPLOYEES e JOIN HR.DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
3* WHERE e.SALARY > 1500;
Jennifer Administration
Michael Marketing
Pat Marketing
Den Purchasing
…………………………
Luis Finance
Shelley Accounting
William Accounting
106 rows selected.
SYS@CDB$ROOT> ALTER SESSION SET events '10046 trace name context off';
Session altered.
SYS@CDB$ROOT>
特性 |
9i及更早 |
10g |
11g |
12c~及以后 |
跟踪级别支持 |
1,4,8,12 |
1,4,8,12 |
增加16,32,64 |
同11g,优化自适应支持 |
执行计划输出时机 |
无固定规则 |
游标关闭时 |
首次执行后 |
同11g |
文件存储结构 |
user/background_ |
同9i |
DIAGNOSTIC_DEST |
同11g,支持PDB隔离 |
文件位置查询 |
复杂多表查询 |
同9i |
v$diag_info视图 |
同11g |
关键增强 |
基础框架 |
tracefile_identifier |
新增级别、诊断目录统一 |
自适应优化器集成 |