暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

oracle 跟踪工具 - 10053事件 10132事件

原创 不吃草的牛_Nick 2023-11-03
146

    10053事件

如果你正因为查询优化器做出的决定而陷入严重的困境,并且想知道到底是怎么回事,查询优化器跟踪可能会有所帮助。但我提醒你,阅读跟踪文件并不是一件轻松的任务。幸运的是,你不用经常去读那些文件,除非你是真的对查询优化器的内部工作机制感兴趣。

 

如果想在某时为一个SQL语句生成跟踪文件并希望手动执行这条语句,常见的做法是将它嵌入到下面两条SQL语句中间,从而启用和禁用10053事件。注意跟踪文件只有在执行硬解析时才会 生成:

alter session set events '10053 trace name context forever';

alter session set events '10053 trace name context off';

 

如果无法手动执行SQL语句,从11.1版本开始你可以通知查询优化器对一个通过具体的sql_id指定的SQL语句在下次发生硬解析时生成一个跟踪文件。要启用或禁用这种行为,可以使用类似下面这样的SQL语句(当然,你需要更改作为参数传递的sql_id)。

 

这种方法的好处是可以让应用程序发出对应的SQL语句。这样会给你一个与在真实执行环境中执行的真正SQL语句一样的跟踪文件。注意这种方法也可以在会话级别使用。直接将ALTER SYSTEM语句用ALTER SESSION语句替换就可以:

alter system set events 'trace[rdbms.sql_optimizer.*][sql:9s5u1k3vshsw4]';

alter system set events 'trace[rdbms.sql_optimizer.*][sql:9s5u1k3vshsw4] off';

 

如果你想分析与库缓存中存储的一个游标关联的SQL语句,从11.2版本开始,可以利用dbms_sqldiag包中的dump_trace过程。这种方法既不需要执行SQL语句,也不需要知道SQL语句被解析的真实环境。也无需知道与游标关联的绑定变量的值。这个过程会从库缓存中取得它需要的所有信息,并通知查询优化器重新优化SQL语句并转储一个跟踪文件。下面演示一下如何调用它:

dbms_sqldiag.dump_trace(

p_sql_id =>'30g1nn8wdymh3',

p_child_number => 0,

p_component => 'Optimizer',

p_file_id   => 'test'

);

 

这个过程的输入参数如下所示。

Ø  p_sql_id 指定要处理的父游标。

Ø  p_child_number 指定子游标号,它与p_sql_id一起,就可以标识要处理的子游标。这个参数是可选的,且默认值为0。

Ø  p_component 指定该过程是否转储optimizer或Compiler跟踪。简单来说,前者模拟设置10053 事件,后者在跟踪文件中写入更多的信息。

Ø  p_file_id 为tracefile_identifier初始化参数指定一个值。这个参数是可选的,并且默认值为NULL。

 

与你如何启用跟踪无关,查询优化器会生成包含大量关于它执行的工作信息的跟踪文件。在文件中你会发现由初始化参数、系统统计信息和对象统计信息决定的执行环境,以及为了找出最高效的执行计划而执行的估算信息。描述这个事件生成的跟踪文件的内容超出了本书的范围。如有必要,请参考下面的资源。

Ø  Wolfgang Breitling的论文: A Look under the Hood of CBO: The 10053 Event。

Ø  Oracle Support文档: CASE STUDY: Analyzing 10053 Trace Files (338137.1)。

Ø  Jonathan Lewis的著作Cost-Based Oracle Fundamentals(Apress,2006)的第14章。

 

每个服务进程都会将它解析的SQL语句的所有数据写入到自己的跟踪文件中。这不仅意味着跟踪文件可以包含关于多个SQL语句的信息,而且一旦在多个会话中打开跟踪文件的生成,也会出现多个跟踪文件。

 

 10132事件

可以使用10132事件引发一个跟踪文件的生成,其中包含与每次硬解析关联的执行计划。如果想为特定的模块或应用程序保留所有执行计划的历史记录,这会很有帮助。下面的例子展示了在跟踪文件中为每个SQL语句存储的这种类型的信息,主要是SQL语句和它的执行计划(包含关于谓词的信息)。注意这段输出中我裁掉的两个部分,是提供关于执行环境信息的一长串参数和补丁修复:


 

初始化参数和补丁修复信息的列表特别长。出于这个原因,根据你使用的版本,即使最简单的SQL语句也会有大概10~30KB的数据写入到跟踪文件中。这样一个跟踪文件的生成可能是一个相当大的开销。应该在只有真正需要时才激活10132事件。10132事件可以通过以下方式启用和禁用。

 

为当前会话启用和禁用此事件。

alter session set events '10132 trace name context forever';

alter session set events '10132 trace name context off';

 

为整个数据库启用和禁用此事件。警告:这样设置不会立即生效,只会对修改后创建的会话起作用。

alter system set events '10132 trace name context forever';

alter system set events '10132 trace name context off';

 

每个服务进程都会将关于它解析的SQL语句的所有数据写入到自己的跟踪文件中。这不仅意味着跟踪文件可以包含关于多个SQL语句的信息,而且一旦在多个会话中打开跟踪文件的生成,也会出现多个跟踪文件。

 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论