zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

SQL调优和诊断工具之Optimizer Trace(10053 Event)介绍

SQL工具 介绍 调优 Event 诊断 Trace Optimizer
2023-06-13 09:11:17 时间

概述

通过Optimizer Trace(10053 Event)可以跟踪优化器(CBO)的动作内容,了解CBO是如何选择最优执行计划的,诊断SQL解析时的相关问题。

本文将介绍Optimizer Trace(10053 Trace)在不同场景下的取得方法和例子。

基本的Optimizer Trace(10053 )取得方法

Optimizer Trace(10053 )最基本的取得方法为,通过在某个会话开始时设定10053 trace,然后在执行分析对象SQL文,来取得相关的信息。

具体取得方法通过alter session的方式设定10053 Event

alter session set tracefile_identifier='10053';
alter session set max_dump_file_size = UNLIMITED;
alter session set timed_statistics=true;
alter session set events '10053 trace name context forever, level 1';
<分析对象的SQL文>
alter session set events '10053 trace name context off';

也可以通过oradebug 的方式设定10053 Event

SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug event 10053 trace name context forever, level 1
<分析对象的SQL文>
SQL> oradebug event 10053 trace name context off

小提示

1.这种方法只有在SQL文硬解析时才会生成相关的Optimizer Trace(10053 Trace)。

所以如果针对已经执行过的SQL可以通过以下2个方法,强制硬解析:

■在执行SQL文前刷新共享池
如:
SQL> alter system flush shared_pool;
■针对SQL文追加一些注释,使其变成不同的游标。
如:
SQL文:select * from dual;
追加注释变为:
select /* for 10053*/ * from dual;

2.生成的跟踪文件会在以下的路径中生成:

■10.2以前的版本:

参数user_dump_dest指定的路径

例:
SQL> show parameter user_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /home2/ora10205/app/oracle/admin/ora10205/udump

■11.1以后的版本:

参数diagnostic_dest指定的路径的下面子路径中

<diagnostic_dest>/diag/rdbms/<dbname>/<instancename>/trace/

(其中dbname和instancename为数据库名和实例名)

例如:
SQL> conn /as sysdba
Connected.
SQL> show parameter diagnostic_dest


NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest string /u01/app/oracle

跟踪日志文件输出路径为:/u01/app/oracle/diag/rdbms/ora12102/ora12102/trace/

同时取得SQL Trace(10046)

在解决某些问题时,通常需要同时取得SQL Trace(10046)和Optimizer Trace(10053 ),可以通过如下方法取得:

alter session set tracefile_identifier='10053_10046';
alter session set max_dump_file_size = UNLIMITED;
alter session set timed_statistics=true;
alter session set events '10053 trace name context forever, level 1';
alter session set events '10046 trace name context forever, level 12';
<<分析对象的SQL文>>
alter session set events '10046 trace name context off';
alter session set events '10053 trace name context off';
exit

通过上面方式取得的跟踪文件中SQL Trace(10046)和Optimizer Trace(10053 )会同时混在,为了方便查看在Linux下可以通过grep命令把10053相关的信息抽出到一个新文件中。

grep -v PARS input10053TraceName.trc |grep -v 'END OF'| grep -v FETCH |grep -v EXEC |grep -v WAIT |grep -v 'STAT ' |grep -v '====' |grep -v 'BINDS #' |grep -v 'value=' |grep -v oacflg |grep -v oacdef |grep -v 'bfp=' > OutputFileName.txt

取得特定SQL ID的Optimizer Trace(10053)

在11gR1以后的版本中,可以针对某个特定SQL ID硬解析时取得Optimizer Trace(10053 Trace)。

具体取得方法对某个硬解析进行跟踪:

SQL> alter session set tracefile_identifier='10053';
SQL> alter session set max_dump_file_size = unlimited;
---启用Trace
SQL> ALTER SESSION SET EVENTS 'trace[rdbms.SQL_Optimizer.*][sql:<SQL_ID>]';
SQL> --<<分析对象的SQL文>> --
---停止Trace
SQL> ALTER SESSION SET EVENTS 'trace[rdbms.SQL_Optimizer.*] off';

对多个硬解析进行跟踪:

SQL> alter session set tracefile_identifier='10053';
SQL> alter session set max_dump_file_size = unlimited;
---启用Trace
SQL> ALTER SESSION SET EVENTS 'trace[rdbms.SQL_Optimizer.*][sql:<SQL_ID1>| <SQL_ID2>]';
SQL> --<<分析对象的SQL文>> --
---停止Trace
SQL> ALTER SESSION SET EVENTS 'trace[rdbms.SQL_Optimizer.*] off';

其中,和替换为相应的SQL ID。

例如:
SQL> alter system set events 'trace[sql_optimizer.*] [sql: gcaxax8tgmjvt]';

SQL> alter system set events 'trace[sql_optimizer.*] [sql: gcaxax8tgmjvt | g2mjrzx0w5ysv ]';

取得解析过的SQL的Optimizer Trace(10053)

在11gR2以后的版本中,追加DBMS_SQLDIAG.DUMP_TRACE()这个功能方法,可以针对内存中的SQL不需要重新执行SQL,而是通过相关的统计信息进行解析生成Optimizer Trace(10053)。

具体取得方法

--1.找到要跟踪SQL的SQL ID
SQL> select sql_id, child_number, sql_text from v$sql
where sql_text like '%Part of SQL%';


--2.确认当前的执行计划
SQL> set pages 0
SQL> select * from
table(DBMS_XPLAN.DISPLAY_CURSOR(SQL_ID=>'&sqlid', cursor_child_no =>0,format=>'ALL'));


--3.生成Optimizer Trace(10053)
SQL> BEGIN
DBMS_SQLDIAG.DUMP_TRACE(
P_SQL_ID => '&P_SQL_ID',
P_CHILD_NUMBER => 0,
P_COMPONENT => 'Compiler',
P_FILE_ID => '10053_TRACE');
END;
/

关于DBMS_SQLDIAG.DUMP_TRACE

DBMS_SQLDIAG中的DUMP_TRACE方法是11gR2版本推出的新方法,用于生成Optimizer Trace(10053 Trace),其主要特点是执行这个方法时不需要重新执行指定的SQL,而是自动地仅触发指定的SQL的硬解析。

DBMS_SQLDIAG.DUMP_TRACE的定义并未公开,但是我们可以通过以下的文件(dbmsdiag.sql)对其进行查看:

$ more $ORACLE_HOME/rdbms/admin/dbmsdiag.sql
...
-------------------------------- dump_trace ---------------------------------
-- NAME:
-- dump_trace - Dump Optimizer Trace
--
-- DESCRIPTION:
-- This procedure dumps the optimizer or compiler trace for a give SQL
-- statement identified by a SQL ID and an optional child number.
--
-- PARAMETERS:
-- p_sql_id (IN) - identifier of the statement in the cursor
-- cache
-- p_child_number (IN) - child number
-- p_component (IN) - component name
-- Valid values are Optimizer and Compiler
-- The default is Optimizer
-- p_file_id (IN) - file identifier
-----------------------------------------------------------------------------
PROCEDURE dump_trace(
p_sql_id IN varchar2,
p_child_number IN number DEFAULT 0,
p_component IN varchar2 DEFAULT 'Optimizer',
p_file_id IN varchar2 DEFAULT null);

通过上面的输出我们可以看到,dump_trace方法参数的含义如下:

P_SQL_ID : 指定SQL_ID
P_CHILD_NUMBER : SQL的子游标Number,默认0
P_COMPONENT : Trace的种类,默认为'Optimzer'
'Optimzer'-Optimzer Trace 相当于debug 的SQL_Optimizer级别
'Compiler'-更详细的Trace,相当于debug 的SQL_Compiler级别
P_FILE_ID : 输出文件的标识字符串,用于查找文件,默认NULL

‘Optimzer’和’Compiler’的区别

‘Optimzer’和’Compiler’的区别相当于SQL_Optimizer和SQL_Compiler的区别,我们可以通过oradebug doc的方式查看到SQL_Optimizer是SQL_Compiler的子集,SQL_Compiler比SQL_Optimizer能够取得更多的信息。

SQL> oradebug doc component SQL_Compiler
SQL_Compiler SQL Compiler ((null))
SQL_Parser SQL Parser (qcs)
SQL_Semantic SQL Semantic Analysis (kkm)
SQL_Optimizer SQL Optimizer ((null))
SQL_Transform SQL Transformation (kkq, vop, nso)
SQL_MVRW SQL Materialized View Rewrite ((null))
SQL_VMerge SQL View Merging (kkqvm)
SQL_Virtual SQL Virtual Column (qksvc, kkfi)
SQL_APA SQL Access Path Analysis (apa)
SQL_Costing SQL Cost-based Analysis (kko, kke)
SQL_Parallel_Optimization SQL Parallel Optimization (kkopq)
SQL_Plan_Management SQL Plan Managment (kkopm)
SQL_Plan_Directive SQL Plan Directive (qosd)
SQL_Code_Generator SQL Code Generator (qka, qkn, qke, kkfd, qkx)
SQL_Parallel_Compilation SQL Parallel Compilation (kkfd)
SQL_Expression_Analysis SQL Expression Analysis (qke)
MPGE MPGE (qksctx)
ADS ADS (kkoads)

小提示:

这种方法不执行SQL,而仅仅利用内存中SQL的相关信息重新Hard Parse,生成Optimizer Trace(10053),所以有时并不能完全真实地反映出已经执行完SQL的生成过程。而且执行操作会话的参数设定也会影响到解析结果。