oracle中10046事件怎么用

59次阅读
没有评论

共计 3409 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要介绍 oracle 中 10046 事件怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

10046 的 定义

  sql_trace/10046 事件是 oracle 提供的用于进行 sql 跟踪的手段,其内容包括 sql 的解析过程、sql 的执行计划、绑定变量的使用、会话发生的等待事件。

10046 生成语句方法:

SQL   alter session set events 10046 trace name
context forever,level 12

现在随便查询一个什么,如:

select * from
dba_users where rownum 20

查看 trace 文件

SQL
select * from v$diag_info;

里面有个 Default Trace File

 1 Default Trace File

/u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_ora_28613.trc

10g 的话,show parameter dump; 找 udump

10046 级别

目的:获取 sql、pl_sql 等相关语句的执行情况解析

10046 级别:共 4 个级别 分别为 0、1、4、8、12

  10046 事件是 SQL_TRACE 的扩展,被戏称为 吃了兴奋剂的 SQL_TRACE

  有效的追踪级别:

  ① 0 级:SQL_TRACE=FASLE

  ② 1 级:SQL_TRACE=TRUE,这是缺省级别

  ③ 4 级:1 级 + 绑定变量

  ④ 8 级:4 级 + 等待事件

  ⑤ 12 级:4 级 + 8 级

tkprof:oracle 内置的针对跟踪文件格式化的一种工具

alter session set
events 10046 trace name context forever, level 12   – 当前会话启用跟踪

alter session set
events 10046 trace name context off  
– 关闭当前会话跟踪

select sid,serial#,username from v$session where username is not
null;  – 查询 sid 和 serial

execute
dbms_system.set_ev(sid,serial#,10046,12,  
– 在当前会话对其它会话进行跟踪

execute
dbms_system.set_ev(sid,serial#,10046,0,  
– 在当前会话关闭其它会话跟踪

tkprof 常用参数

tkprof  回车查看一下帮助  
就知道怎么用了   tkprof 解析源追踪文件   解析完成的文件  

filename 由 SQL trace 产生的输入跟踪文件

explain SQL 语句的 explain plain

recoed 创建非递归 SQL 语句的 SQL 脚本

waits 记录等待事件的汇总

SORT 根据一个或多个项目提供分类数据,如 PRSCPU(CPU 时间分析)、PRSELA(已用时间分析)等

table 定义表的名称,TKPROF 实用程序暂时将执行计划放入该表中

sys 启用或禁用由 sys 给出的一组 SQL 语句

PRINT 仅列出指定数量的 SQL 语句,而不是所有的 SQL 语句

insert 创建存储跟踪数据库信息的脚本

与 10046 相关的两个参数:

show
parameter max_dump_file_size;

对 trace 文件的大小限制

show
parameter timed_statistics;

对重要信息的收集是否开启

10046 怎么看?

tkprof 文件都包含以下内容:

sql 语句

分析 执行 获取调用的次数

被处理的行数

所使用 CPU 的秒数

所使用的 IO

库高速缓存未命中

可选的执行计划

行源 操作列表

一个报告,总结分析了在跟踪文件中有多少相似和完全不同的语句,如果同样的语句,parse 列总是一个大值,说明没有用上绑定变量

count    =
number of times OCI procedure was executed。OCI 为 oracle 的调用接口,提供了一组可对 ORACLE 数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如 C 语言)中进行调用可达到存取 ORACLE 数据库的目的。

cpu      =
cpu time in seconds executing  以秒为单位的

elapsed  = elapsed
time in seconds executing 以秒为单位的消耗时间

disk     =
number of physical reads of buffers from disk 物理读

query    =
number of buffers gotten for consistent read 为了一致性读获得的空间。

在一致性读模式下,所有 parse、execute、fetch 所获得的 buffer 的数量。一致性模式的 buffer 是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。

current  = number of
buffers gotten in current mode (usually for update) 数据库块命中的次数,通常是为了 update

在 current 模式下所获得的 buffer 的数量。一般在 current 模式下执行 insert、update、delete 操作都会获取 buffer。

rows     =
number of rows processed by the fetch or execute call 每一种调用类型所处理的行的总数

还有这些:

Misses in library cache during parse:发生在解析的硬解析数量,如果是软解析则 Misses in library cache during parse 将为 0

Misses in library cache during execute:发生在执行调用阶段的硬解析数量。如果在执行调用时没有硬解析发生,Misses in library cache during execute 这一行将不存在。

重点参考:http://czmmiao.iteye.com/blog/1493765

分析下面一段代码:

SQL ID: 00fqk94bdzqnj Plan Hash:
644658511

select sid,serial#,username

from

 v$session where username is not null

call  count① 
cpu  elapsed  disk 
query  current  rows

——- ——  ——– ———- ———- ———-
———-  ———-

Parse  1 
0.01  0.01  0  0  0  0

Execute  1 
0.00  0.00  0  0  0  0

Fetch  2 
0.00  0.00  0  0  0  2

——- ——  ——– ———- ———- ———-
———-  ———-

total  4 
0.01  0.01  0②  0  0  2

Misses in library cache during parse: 1

Optimizer mode: ALL_ROWS

Parsing user id: SYS

Number of plan statistics captured: 1

①假设 count 这列,fetch 部分执行了 17324 次,获得的 rows 行数是 259806,两者相除,就可以得出一次获取,能够获取多少行记录,一次获得 15 行数据,怀疑是用了数组取操作。

②理论上,elapsed time=CPU time+disk time,即如果 elapsed time 为 1.85,CPU 为 1.82,那么 disk 可能就是 3。但是也可能是有等待事件,把大量时间花在了等待事件上。

③可以通过磁盘 IO 所占逻辑 IO 的比例,disk/query+current 来判断磁盘 IO 的情况,太大的话有可能是 db_buffer_size 过小,当然这也跟 SQL 的具体特性有关

④query+current/rows
平均每行所需的 block 数,太大的话(超过 20)SQL 语句效率太低,数据过于分散,可以考虑重组对象

⑤通过 SQL ID:
06nvwn223659v Plan Hash: 0 标识出一个新的 SQL 分析,会发现很多是系统自己的 SQL,直接不用看

以上是“oracle 中 10046 事件怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计3409字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)