59-Oracle 10046事件-知识准备
上一篇说到了autotrace,SQL调试时候的获取性能和参数数据,直接用上trace,还有个更全能的工具10046。是不是很多小伙伴会对这么个数字,觉得起名很奇怪,数字起名任性。“10046”本质是Oracle内核事件的随机性技术编号,类似于软件中的错误代码,Oracle开发团队设计,数字本身并无特殊含义,而是用于在代码层唯一标识特定功能模块或诊断事件。
一、Oracle内部事件编码规则
- 10046:SQL执行全链路跟踪
- 10053:优化器成本计算逻辑跟踪
- 10235:数据块损坏检测事件
二、功能特点和技术原理
1. 核心功能特点
- 提供SQL执行全貌,包括SQL文本、执行计划、物理/逻辑I/O次数、CPU时间以及处理的行数等核心指标。此级别相当于标准SQL_TRACE的功能,但信息组织更为系统化。
- 在Level 1基础上增加对绑定变量值的跟踪能力。此功能对于解决因绑定变量窥视(Bind Peeking)导致的执行计划不稳定问题至关重要,能够揭示不同绑定值对执行路径的影响。
- 在Level 1基础上增加对等待事件细节的记录,包括事件名称、等待时间及等待次数。此级别特别有助于分析I/O竞争(latch free, enqueue)、锁争用和缓冲区忙等待等并发问题。
- 作为最常用的级别,Level 12结合了Level 1、4和8的全部功能,同时捕获SQL统计信息、绑定变量值和等待事件,提供360度的性能洞察。这是诊断复杂性能问题的首选级别。
- 在11g及更高版本中引入的增强级别。Level 16为每次执行生成执行统计信息;Level 32则减少执行计划输出以精简文件;Level 64在首次执行后当执行时间显著增加时补充生成执行计划,用于捕获计划突变(Plan Flip)问题。
跟踪级别 | 功能描述 | 适用场景 |
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 | 自适应执行计划生成 | 执行计划突变分析 |
2. 底层技术原理
- 记录SQL的硬解析/软解析细节,包括库缓存未命中情况(library cache misses)、语法分析树生成过程以及优化器成本计算。此阶段生成的信息对理解解析开销至关重要,特别是当应用存在大量硬解析时。
- 捕获运行时统计信息,包括物理读/写次数(disk)、一致性读(consistent gets)、当前模式读(db block gets)以及CPU消耗。同时记录执行计划的实际运算过程,包括行操作(Row Source Operation)的执行顺序和数据流。
- 跟踪结果集返回过程中的性能指标,包括网络往返次数、获取行数以及客户端处理延迟。此阶段信息对识别网络瓶颈或结果集过大问题有重要价值。
- 在各级别激活时,分别记录变量绑定细节(如变量数据类型、值、长度)和资源等待细节(如等待事件名称、持续时间、参数)。这些信息写入磁盘上的跟踪文件,默认存储在user_dump_dest或background_dump_dest目录(11g之前)或统一的DIAGNOSTIC_DEST目录(11g及以后)。
- timed_statistics:启用高精度时间统计,为等待事件和CPU时间提供微秒级精度
- max_dump_file_size:控制跟踪文件大小,避免磁盘溢出
- tracefile_identifier:设置跟踪文件标识符,简化文件定位
- statistics_level:设置为ALL时增强执行计划细节
三、版本演进与特性变化
1. Oracle 9i及更早版本
版本特性验证脚本:
-- 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';
2. Oracle 10g版本
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(多次执行)
BEGINFOR i IN 1..5 LOOPEXECUTE 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';
3. Oracle 11g版本
- 引入DIAGNOSTIC_DEST参数统一管理所有诊断文件,取代了传统的user_dump_dest和background_dump_dest分离结构。跟踪文件路径标准化为:/diag/rdbms///trace/,极大简化了文件定位。
- 调整为在游标的第一次执行后立即写入跟踪文件,执行统计信息仅反映该次执行的数据。这一变化使得分析单次执行行为更准确,但失去了历史累计视角。
- 引入Level 16(每次执行生成STAT行)、Level 32(减少执行计划输出)和Level 64(自适应执行计划生成)。特别是Level 16使得分析多次执行场景中每次执行的差异性成为可能,对理解执行计划稳定性价值显著。
- 提供通过v$diag_info视图直接查询当前会话跟踪文件路径的能力,取代了复杂的多表连接查询。
版本特性验证脚本:
-- 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(多次执行)
BEGINFOR i IN 1..3 LOOPEXECUTE 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';
4. Oracle 12c~及后续版本
- 针对12c引入的自适应执行计划特性(如自适应连接方法、自适应并行分布),10046跟踪增加了相关诊断信息。在Level 8和Level 12中可捕获因自适应优化器特性导致的额外等待事件和执行计划调整。
- 在CDB/PDB架构中,10046跟踪文件按容器隔离存储,路径中包含PDB标识信息。在PDB环境中,诊断文件存储在/diag/rdbms///trace/目录中,确保多租户环境下的诊断隔离。
版本特性验证脚本-PDB上实操:
-- 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_NAME2 FROM HR.EMPLOYEES e JOIN HR.DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID3* WHERE e.SALARY > 1500;
Jennifer Administration
Michael Marketing
Pat Marketing
Den Purchasing
…………………………
Luis Finance
Shelley Accounting
William Accounting106 rows selected.
SYS@CDB$ROOT> ALTER SESSION SET events '10046 trace name context off';
Session altered.
SYS@CDB$ROOT>
Oracle各版本10046事件能力对比
特性 | 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 | 新增级别、诊断目录统一 | 自适应优化器集成 |