设为首页 加入收藏

TOP

查看Oracle执行计划的几种常用方法-系列3(一)
2015-07-24 10:36:20 来源: 作者: 【 】 浏览:3
Tags:查看 Oracle 执行 计划 常用 方法 系列

续上篇:http://blog.csdn.net/bisal/article/details/39225373

4. 10046事件

通过10046事件也可以查看目标SQL的执行计划。像10046这种事件,都不是Oracle官方文档中可以查询到的,这些事件一般用于调试目的,因此往往可以使用他们找到问题更详细的信息。

10046事件和之前的explain plan、DBMS_XPLAN包以及AUTOTRACE开关的区别在于,10046事件产生的trc文件中明确显示了目标SQL实际执行计划中每一步所消耗的逻辑读、物理读和花费的时间,执行计划的成本分析,进而可以看出为什么Oracle对于SQL选择了这样的执行计划,而不是那样的执行计划,之所以说是实际的执行计划,从10046事件执行的过程就可以看出来:

(a) 在当前session激活10046事件。

(b) 在此session中执行SQL。

(c) 关闭此session的10046事件。

真正执行的SQL,对应的执行计划可以在trc文件中找到。这个trc文件会记录SQL的执行计划和资源消耗,命名格式“实例名_ora_当前session的spid.trc”。

(1). 激活10046事件

有两种方法

(a) alter session set events '10046 trace name context forever, level 12';

(b) oradebug setmypid/oradebug setospid SPID;

oradebug event 10046 trace name context forever, level 12;

(2). 查看10046产生的trc文件名和路径的方法

(a) show parameter USER_DUMP_DEST显示trc文件存储的路径 -> 查找对应当前session的trc文件(若当前是单用户,则是最新产生的文件)。

实验:

\

(b) 使用上述(b)的ordebug产生trc文件,可以用Z??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmFkZWJ1ZyB0cmFjZWZpbGVfbmFtZbXDtb10cmPOxLz+w/u6zcK3vrahozwvcD4KPHA+b3JhZGVidWfT0LrctuDQ6NKqy7W1xKOsPHN0cm9uZz7K18/I1eLKx3NxbHBsdXPM2NPQtcTD/MHuo6zU2lBMU1FMIERldmVsb3Blcjwvc3Ryb25nPjxzdHJvbmc+1tDWtNDQu+HM4cq+zt7Qp7XEU1FM0+++5Dwvc3Ryb25nPqOswP3I56O6PC9wPgo8cD48aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/57/1_bf4in__.png" alt="\">

其次它是sysdba角色的命令,使用非sysdba执行会提示ORA-01031权限不足,例如:

\

使用sysdba登录后,可以查看oradebug的帮助:

\

\

尽管oradebug用的时候需要使用sysdba登录,看似有些麻烦,但和第一种alter session的方法相比,最大的好处就是alter session只能针对当前会话或系统级,即alter session或alter system设置,如果设置非本会话的跟踪,此时就可以用oradebug了,(据说dbms_system、dbms_monitor和dbms_support也可以实现相同的需求,但没有试过)。

使用oradebug设置10046事件之前需要首先设置待跟踪的会话:

(a) 跟踪本会话,使用:oradebug setmypid即可。

(b) 跟踪非本会话,使用:oradebug setospid SPID(来自v$process)。

查找SPID的方法

(a) select * from v$session a where audsid = userenv("sessionid');返回SID值。

(b) select s.USERNAME,
s.OSUSER,
s.SID,
s.PADDR,
s.PROCESS,
p.spid os_process_id,
p.pid oracle_process_id
from v$session s, v$process p
where s.paddr = p.addr
and s.username = upper('待跟踪session用户名')
and s.SID = (a)返回的SID;

例如:

\

其中:

v$process中的SPID是指操作系统的进程,即操作系统的PID
v$session中的pid, serial#是oracle分配的PID

此时如果需要跟踪24061这个session执行的SQL,可以用oradebug setospid 24061,然后oradebug event 10046 trace name context forever, level 12;就打开了10046事件。

接着可以通过oradebug tracefile_name查看trace文件名和路径,例如:

\

看下petest_ora_22756.trc的内容:

\

除了机器、实例、进程等基本信息外,真正写入的内容:

Received ORADEBUG command "tracefile_name' from process Unix process pid: 22235, image:

表示接收到来自Unix的操作系统进程PID是22235的ORADEBUG命令,参数tracefile_name。

显然22235这个进程是sqlplus登陆后执行ORADEBUG的客户端,例如:

\

(3). 关闭10046的方法

(a) alter session set events "10046 trace name context off';

(b) oradebug event 10046 trace name context off;

分别对应两种打开10046事件的方法。

(4). 再说说oradebug和alter session打开10046事件产生trace文件的区别

(a) 使用alter session打开10046事件时,如果未执行SQL,则不会产生trace文件

(b) 使用oradebug event 10046 trace name context forever, level 12;打开10046事件,此时就已经产生trace文件,除基本信息外,主要是一行:

WAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1379395297285576

当使用oradebug event 10046 trace name context off;关闭10046事件,会写入一行:

WAIT #0: nam='SQL*Net message from client' ela= 30946429 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=1379395328232564

(5). trace跟踪文件

上面说了打开和

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle基础知识笔记(10)约束 下一篇浅析ORACLE数据库高水位线(highwa..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·TCP/UDP协议_百度百科 (2025-12-26 12:20:11)
·什么是TCP和UDP协议 (2025-12-26 12:20:09)
·TCP和UDP详解 (非常 (2025-12-26 12:20:06)
·Python 教程 - W3Sch (2025-12-26 12:00:51)
·Python基础教程,Pyt (2025-12-26 12:00:48)