59-Oracle 10046事件-知识准备

上一篇说到了autotrace,SQL调试时候的获取性能和参数数据,直接用上trace,还有个更全能的工具10046。是不是很多小伙伴会对这么个数字,觉得起名很奇怪,数字起名任性。"10046"本质是Oracle内核事件的随机性技术编号,类似于软件中的错误代码,Oracle开发团队设计,数字本身并无特殊含义,而是用于在代码层唯一标识特定功能模块或诊断事件。

一、Oracle内部事件编码规则​

Oracle使用5位数字作为内部事件的标识符(如10046、10053)。
这些数字是开发团队预定义的常量,用于在数据库内核中触发特定诊断行为。例如:

  1. 10046:SQL执行全链路跟踪
  2. 10053:优化器成本计算逻辑跟踪
  3. 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 | 新增级别、诊断目录统一 | 自适应优化器集成 |

相关推荐
@十八子德月生1 小时前
第十章——8天Python从入门到精通【itheima】-99~101-Python基础综合案例-数据可视化(案例介绍=JSON格式+pyecharts简介)
大数据·python·信息可视化·pycharm·echarts·数据可视化
网硕互联的小客服4 小时前
高并发下分布式数据库性能下降的解决方法
数据库·分布式
qq_463944864 小时前
【Spark征服之路-3.2-Spark-SQL核心编程(一)】
sql·ajax·spark
静听山水5 小时前
PostgreSQL/Hologres 外部数据包装器系统表 pg_foreign_data_wrapper 详解
数据库·postgresql
神洛华5 小时前
SQL Server基础语句1:基础查询、数据筛选 / 排序 、分组聚合
数据库·sql
DoWeixin65 小时前
【请关注】mysql一些经常用到的高级SQL
数据库·mysql
时序数据说5 小时前
时序数据库双存储引擎技术解析
大数据·数据库·物联网·开源·时序数据库·iotdb
远方16095 小时前
54-Oracle 23 ai DBMS_HCHECK新改变-从前的hcheck.sql
大数据·数据库·sql·oracle·database
Java初学者小白5 小时前
秋招Day14 - MySQL - 数据库架构
java·数据库·数据库架构