当前位置: 首页 > news >正文

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)的具体资源消耗数据。
版本特性验证脚本​: 
-- 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版本
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视图直接查询当前会话跟踪文件路径的能力,取代了复杂的多表连接查询。
​版本特性验证脚本​: 
-- 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及后续版本(包括18c、19c和21c)在保持10046事件核心功能稳定的同时,主要进行了 生态系统适应性改进​:
自适应优化器集成 ​:
  • 针对12c引入的自适应执行计划特性(如自适应连接方法、自适应并行分布),10046跟踪增加了相关诊断信息。在Level 8和Level 12中可捕获因自适应优化器特性导致的额外等待事件和执行计划调整。
多租户环境支持 ​:
  • 在CDB/PDB架构中,10046跟踪文件按容器隔离存储,路径中包含PDB标识信息。在PDB环境中,诊断文件存储在/diag/rdbms///trace/目录中,确保多租户环境下的诊断隔离。
云环境增强 ​:
针对Exadata、Autonomous Database等云环境优化了跟踪文件访问接口,支持通过DBMS_CLOUD包访问跟踪文件,便于云环境中的诊断分析。
版本特性验证脚本​-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_
dump_dest分离

同9i

DIAGNOSTIC_DEST
统一存储

同11g,支持PDB隔离

​文件位置查询​

复杂多表查询

同9i

v$diag_info视图

同11g

​关键增强​

基础框架

tracefile_identifier

新增级别、诊断目录统一

自适应优化器集成

http://www.lryc.cn/news/573355.html

相关文章:

  • 1.23Node.js 中操作 mongodb
  • Django中为api自定义一些装饰器:如参数校验等
  • 获取 Git 仓库
  • npm包冲突install失败
  • 深入浅出:Go语言中的Cookie、Session和Token认证机制
  • Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络
  • SiteAzure:解决数据库服务器内存频繁吃满
  • 【Flutter】状态管理框架Provider和Get对比分析(面试常用)
  • 57-Oracle SQL Profile(23ai)实操
  • 编程基础:耦合
  • 跨平台SEH实现的方法
  • Skrill是什么?中国用户能用吗?安全吗?完整指南
  • DAY 38 Dataset和Dataloader类
  • Python编程语言:2025年AI浪潮下的技术统治与学习红利
  • Python UDP Socket 实时在线刷卡扫码POS消费机服务端示例源码
  • 自动化立体仓库堆垛机控制系统STEP7 FC3功能块 I/O映射
  • `provide` 和 `inject` 组件通讯:实现跨组件层级通讯
  • 机器学习15-XGBoost
  • 微服务拆分——nacos/Feign
  • 华为云Flexus+DeepSeek征文 | 基于Flexus X实例的金融AI Agent开发:智能风控与交易决策系统
  • 李宏毅2025《机器学习》第三讲-AI的脑科学
  • 蓝牙数据通讯,实现内网电脑访问外网电脑
  • WPF调试三种工具介绍:Live Visual Tree、Live Property Explorer与Snoop
  • SylixOS 下的消息队列
  • Jupyter notebook调试:设置断点运行
  • Redis后端的简单了解与使用(项目搭建前置)
  • DeepEP开源MoE模型分布式通信库
  • 洛谷P3953 [NOIP 2017 提高组] 逛公园
  • 【DCS开源项目】—— Lua 如何调用 DLL、DLL 与 DCS World 的交互
  • day44-硬件学习之arm启动代码