当前位置:  数据库>oracle

使用10046事件查看Oracle执行计划

    来源: 互联网  发布时间:2017-06-15

    本文导语: 使用10046事件查看Oracle数据库中的执行计划,能够得到SQL执行计划中每一个执行步骤所消耗的逻辑读,物理读,和花费的时间。这种细粒度的明细显示在我们诊断复杂SQL的性能问题时尤为重要,而且这也是explain plan命令,autotrace...

使用10046事件查看Oracle数据库中的执行计划,能够得到SQL执行计划中每一个执行步骤所消耗的逻辑读,物理读,和花费的时间。这种细粒度的明细显示在我们诊断复杂SQL的性能问题时尤为重要,而且这也是explain plan命令,autotrace命令所不能提供的。不过实际上,我们还可以通过gather_plan_sstatistics Hint 配合dbms_xplan 包一起使用得到和10046事件类似细粒度的明细的执行计划。

我们只需3个步骤就可以容易的通过10046事件获得SQL的执行计划。

1.首先在当前session 中激活10046事件。
2.在当前session 中执行SQL语句。
3.最后当前session 中关闭10046事件。
 当执行完上述步骤后,oracle就会将目标SQL的执行计划和明细资源消耗写入此session对应的trace文件中。
oracle会在user_dump_dest参数设置的目录下产生这个trace文件。
 我们有两种方法在当前session中激活10046事件。
1.在当前session中执行alter session set events '10046 trace naem context forever,level 12'
 2.在当前session中执行oradebug event 10046 trace name context forever,level 12'
上述命令中的关键字”level“后的数字是标识设置的10046时间的level值,这个值是可以修改的,我们
 通常使用的值为12,表示在产生的trace文件中除了有目标sql的执行计划和资源消耗明细外,还包含
SQL使用的绑定变量的值以及该session所经历的等待事件,除了level值外,其他的部分是固定的语法,
 是无法修改的。
 我推荐使用第2种方法,因为可以在激活10046事件后执行命令oradebug tracefile_name可以获得当前
session 所对应的trace文件的具体路径名称。
 我们可以在当前session中关闭10046事件的两种方法:
1.在当前session中执行alter session set events '10046 trace name context off'
 2.在当前session中执行oradebug event 10046 trace naem context off

我们使用一个例子来说明下


1.我们先激活10046事件,我们是oradebug命令来激活。
SQL>oradebug setmypid
 SQL>oradebug event 10046 trace name context forver,level 12
 2.在当前session中激活了10046事件后,我们执行一个SQL语句
SQL>SELECT * FROM hr.test;
 3.使用oradebug tracefile_name 命令查看当前session所对应的trace文件路径和名称
SQL>oradebug tracefile_name
 /app/oracle/diag/rdbms/pxboracle/pxboracle/trace/pxboracle_ora_18565.trc
 4.关闭当前session 中的10046事件:
SQL>oradebug event 10046 trace name context off

下面的内容就是trace文件中的内容


=====================
PARSING IN CURSOR #47006443926880 len=27 dep=0 uid=0 oct=3 lid=0 tim=2879240721898379 hv=2413634929 ad='9e709620' sqlid='4wn49u27xu9bj'
 select * from hr.test
 END OF STMT
 PARSE #47006443926880:c=378943,e=2562085,p=13,cr=721,cu=0,mis=1,r=0,dep=0,og=1,plh=121040406,tim=2879240721898378
 EXEC #47006443926880:c=0,e=81,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=121040406,tim=2879240721898787
 WAIT #47006443926880: nam='SQL*Net message to client' ela= 3 driver id=1650815232 #bytes=1 p3=0 obj#=-1 tim=2879240721898965
 WAIT #47006443926880: nam='Disk file operations I/O' ela= 175 FileOperation=2 fileno=5 filetype=2 obj#=18841 tim=2879240721899603
 WAIT #47006443926880: nam='db file sequential read' ela= 15398 file#=5 block#=138826 blocks=1 obj#=18841 tim=2879240721915091
 WAIT #47006443926880: nam='db file sequential read' ela= 10745 file#=5 block#=138827 blocks=1 obj#=18841 tim=2879240721935221
 FETCH #47006443926880:c=1000,e=36278,p=2,cr=2,cu=0,mis=0,r=1,dep=0,og=1,plh=121040406,tim=2879240721935413
 WAIT #47006443926880: nam='SQL*Net message from client' ela= 6148 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240721941743
 WAIT #47006443926880: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240721941899
 FETCH #47006443926880:c=999,e=178,p=0,cr=1,cu=0,mis=0,r=15,dep=0,og=1,plh=121040406,tim=2879240721942058
 WAIT #47006443926880: nam='SQL*Net message from client' ela= 407527 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240722349676
 WAIT #47006443926880: nam='SQL*Net message to client' ela= 1 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240722349821
 FETCH #47006443926880:c=1000,e=201,p=0,cr=1,cu=0,mis=0,r=7,dep=0,og=1,plh=121040406,tim=2879240722350005
 STAT #47006443926880 id=1 cnt=23 pid=0 pos=1 obj=18841 op='TABLE ACCESS FULL LBBNF (cr=4 pr=2 pw=0 time=36197 us cost=3 size=3036 card=23)'
 WAIT #47006443926880: nam='SQL*Net message from client' ela= 21195539 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240743545997
 CLOSE #47006443926880:c=0,e=14,dep=0,type=0,tim=2879240743546441

*** 2061-03-28 21:05:43.546
 Processing Oradebug command 'tracefile_name'

*** 2061-03-28 21:05:43.546
 Oradebug command 'tracefile_name' console output:
 /app/oracle/diag/rdbms/pxboracle/pxboracle/trace/pxboracle_ora_18565.trc
 WAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240743547147
 WAIT #0: nam='SQL*Net message from client' ela= 18525364 driver id=1650815232 #bytes=1 p3=0 obj#=18841 tim=2879240762072687

*** 2061-03-28 21:06:02.072
 Processing Oradebug command 'event 10046 trace name context off'

*** 2061-03-28 21:06:02.073
 Oradebug command 'event 10046 trace name context off' console output:

 


    
 
 

您可能感兴趣的文章:

  • linux下不使用sudo命令执行docker的操作步骤
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • SUSE10下,如何使用perl语言执行一条语句:从一台机器telnet到远端另一台机器,在远端机器上执行命令,并能获取到执行结果。请高手指点,Very 谢谢~
  • 关于在QT环境下加载gif图片的问题(可以显示,但是只有使用终端启动可执行文件才能显示,双击执行却不显示)这是为什么?
  • 如何使用crontab来定时执行一个.php的程序
  • 使用Statement.java里的execute执行存储过程问题
  • 关于如何使用shell自动执行一个sybase的存储过程
  • 使用终端远程执行程序的问题!
  • 使用java执行定时任务示例
  • 为什么socket程序使用gdb调试执行就接受不到数据了呢?
  • 有谁使用过cgywin吗?它有文字编辑的执行文件吗?
  • 如何让用户只能使用sftp而且不能执行其他shell命令
  • Unix下System函数实现中为何要使用shell去调用执行程序?
  • 我想使用snoop命令,可是又不是root用户,可否设置我的帐户可以执行snoop呢?
  • 请问:在HP-UX下如何替换正在使用的可执行文件?
  • 有谁使用过cgywin吗?它有文字编辑的执行文件吗? iis7站长之家
  • 求教:使用crontab如何完成每间隔80分钟的执行一个命令的方法?
  • gcc使用的问题,为什么不能执行a.out文件?
  • 关于java中执行sql语句使用order by的问题!
  • 使用popen来执行gcc命令,如何根据读出来的gcc的输出来判断gcc是否编译成功?
  • 为何我使用javascript中location'****.jsp'跳到某一页面,jsp页面不重新编译执行
  • 使用epoll lt或者et 每次wait到一个事件处理完后是否需要重新投递事件呢?
  • jquery中交替点击事件toggle方法的使用示例
  • 使用JS或jQuery模拟鼠标点击a标签事件代码
  • jQuery 回车事件enter使用示例
  • MYSQL事件查看器使用介绍
  • 使用mysql事件调度器定时删除binlog
  • 浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
  • 不要使用jQuery触发原生事件的方法
  • winform使用委托和事件来完成两个窗体之间通信的实例
  • C#程序窗体间使用回调事件方式通讯示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎么使用计划任务?
  • 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
  • linux下使用crontab实现定时PHP计划任务失败的原因分析
  • linux使用crontab实现PHP执行计划定时任务
  • Windows中使用计划任务自动执行PHP程序实例
  • Oracle中使用DBMS_XPLAN处理执行计划详解
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Python不使用print而直接输出二进制字符串
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • Office 2010 Module模式下使用VBA Addressof
  • c#中SAPI使用总结——SpVoice的使用方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • asp程序使用的access在Linux下如何使用!
  • c/c++预处理命令预#,##使用介绍
  • 新装的Linux使用root用户不能使用FTP?
  • 在div中使用css让文字底部对齐的方法
  • LINUX下使用Eclipse,如何使用交叉编译器?
  • Python namedtuple(命名元组)使用实例
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3