上一篇说到了autotrace,SQL调试时候的获取性能和参数数据,直接用上trace,还有个更全能的工具10046。是不是很多小伙伴会对这么个数字,觉得起名很奇怪,数字起名任性。"10046"本质是Oracle内核事件的随机性技术编号,类似于软件中的错误代码,Oracle开发团队设计,数字本身并无特殊含义,而是用于在代码层唯一标识特定功能模块或诊断事件。
一、Oracle内部事件编码规则
Oracle使用5位数字作为内部事件的标识符(如10046、10053)。
这些数字是开发团队预定义的常量,用于在数据库内核中触发特定诊断行为。例如:
- 10046:SQL执行全链路跟踪
- 10053:优化器成本计算逻辑跟踪
- 10235:数据块损坏检测事件
此类编号无公开的命名规律,通常与事件引入的版本或功能模块相关。
历史沿袭性
早期版本(如Oracle 7/8)中,SQL_TRACE是基础跟踪功能,而10046作为其增强版被引入,数字编号可能延续了当时的事件序列(如10000~10999区间)
二、功能特点和技术原理
Oracle数据库的10046事件是一种 深层诊断工具 ,被广泛誉为"增强版SQL_TRACE"。它通过激活Oracle内核的跟踪机制,全面记录SQL和PL/SQL语句执行过程中的 关键性能数据。与标准SQL_TRACE相比,10046事件提供了更细粒度的信息捕获能力,能够揭示SQL执行的完整生命周期,包括解析(Parse)、执行(Execute)和获取(Fetch)三个核心阶段。在性能优化领域,10046事件的价值无可替代,它能够帮助DBA精准定位SQL性能瓶颈、分析系统资源消耗模式,并深入理解优化器行为。
1. 核心功能特点
10046事件的核心价值在于其多层次的跟踪能力,不同级别提供不同深度的诊断信息:
基础跟踪(Level 1) :
- 提供SQL执行全貌,包括SQL文本、执行计划、物理/逻辑I/O次数、CPU时间以及处理的行数等核心指标。此级别相当于标准SQL_TRACE的功能,但信息组织更为系统化。
绑定变量捕获(Level 4) : - 在Level 1基础上增加对绑定变量值的跟踪能力。此功能对于解决因绑定变量窥视(Bind Peeking)导致的执行计划不稳定问题至关重要,能够揭示不同绑定值对执行路径的影响。
等待事件跟踪(Level 8) : - 在Level 1基础上增加对等待事件细节的记录,包括事件名称、等待时间及等待次数。此级别特别有助于分析I/O竞争(latch free, enqueue)、锁争用和缓冲区忙等待等并发问题。
全面诊断(Level 12) : - 作为最常用的级别,Level 12结合了Level 1、4和8的全部功能,同时捕获SQL统计信息、绑定变量值和等待事件,提供360度的性能洞察。这是诊断复杂性能问题的首选级别。
高级跟踪(Level 16/32/64): - 在11g及更高版本中引入的增强级别。Level 16为每次执行生成执行统计信息;Level 32则减少执行计划输出以精简文件;Level 64在首次执行后当执行时间显著增加时补充生成执行计划,用于捕获计划突变(Plan Flip)问题。
表:10046事件跟踪级别与功能对应关系
|----------|-----------------|------------|
| 跟踪级别 | 功能描述 | 适用场景 |
| 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. 底层技术原理
10046事件的工作原理本质上是 激活Oracle内核的诊断引擎,通过事件机制将特定的内部仪器点(Instrumentation Points)与跟踪功能关联。当事件激活后,Oracle会在以下关键环节注入诊断代码:
解析阶段 :
- 记录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时增强执行计划细节
三、版本演进与特性变化
Oracle数据库的各版本对10046事件的功能进行了持续增强,这些演进反映了Oracle在诊断能力上的深化和细化。了解不同版本的行为差异对于准确解读跟踪结果至关重要,特别是在跨版本数据库环境中的性能分析工作中。
1. Oracle 9i及更早版本
在Oracle 9i时代,10046事件已 奠定其核心框架,提供了基础跟踪能力但存在诸多限制。该版本支持Level 1、4、8和12级别的跟踪,但每个级别的信息完整度与现代版本相比仍有差距。此时期的跟踪文件存储在传统目录结构中,用户进程跟踪文件位于user_dump_dest,后台进程跟踪文件则位于background_dump_dest,两者分离管理增加了文件定位的复杂度。执行计划输出机制较为简单,缺乏对执行计划细节的深度展示,特别是缺少行操作(Row Source Operation)的具体资源消耗数据。
版本特性验证脚本:
bash
-- 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的双目录设计,尚未引入统一的诊断目录。
版本特性验证脚本:
bash
-- 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';
3. Oracle 11g版本
11g版本标志着10046事件进入 现代化阶段,进行了多项架构性改进:
诊断框架重构 :
- 引入DIAGNOSTIC_DEST参数统一管理所有诊断文件,取代了传统的user_dump_dest和background_dump_dest分离结构。跟踪文件路径标准化为:/diag/rdbms///trace/,极大简化了文件定位。
执行计划输出优化 : - 调整为在游标的第一次执行后立即写入跟踪文件,执行统计信息仅反映该次执行的数据。这一变化使得分析单次执行行为更准确,但失去了历史累计视角。
新增跟踪级别 : - 引入Level 16(每次执行生成STAT行)、Level 32(减少执行计划输出)和Level 64(自适应执行计划生成)。特别是Level 16使得分析多次执行场景中每次执行的差异性成为可能,对理解执行计划稳定性价值显著。
文件位置查询简化 : - 提供通过v$diag_info视图直接查询当前会话跟踪文件路径的能力,取代了复杂的多表连接查询。
版本特性验证脚本:
bash
-- 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';
4. Oracle 12c~及后续版本
12c及后续版本(包括18c、19c和21c)在保持10046事件核心功能稳定的同时,主要进行了 生态系统适应性改进:
自适应优化器集成 :
- 针对12c引入的自适应执行计划特性(如自适应连接方法、自适应并行分布),10046跟踪增加了相关诊断信息。在Level 8和Level 12中可捕获因自适应优化器特性导致的额外等待事件和执行计划调整。
多租户环境支持 : - 在CDB/PDB架构中,10046跟踪文件按容器隔离存储,路径中包含PDB标识信息。在PDB环境中,诊断文件存储在/diag/rdbms///trace/目录中,确保多租户环境下的诊断隔离。
云环境增强 :
针对Exadata、Autonomous Database等云环境优化了跟踪文件访问接口,支持通过DBMS_CLOUD包访问跟踪文件,便于云环境中的诊断分析。
版本特性验证脚本-PDB上实操:
bash
-- 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>
Oracle各版本10046事件能力对比
|------------|------------------------------|----------------------|----------------------|--------------|
| 特性 | 9i及更早 | 10g | 11g | 12c~及以后 |
| 跟踪级别支持 | 1,4,8,12 | 1,4,8,12 | 增加16,32,64 | 同11g,优化自适应支持 |
| 执行计划输出时机 | 无固定规则 | 游标关闭时 | 首次执行后 | 同11g |
| 文件存储结构 | user/background_ dump_dest分离 | 同9i | DIAGNOSTIC_DEST 统一存储 | 同11g,支持PDB隔离 |
| 文件位置查询 | 复杂多表查询 | 同9i | v$diag_info视图 | 同11g |
| 关键增强 | 基础框架 | tracefile_identifier | 新增级别、诊断目录统一 | 自适应优化器集成 |