sql_trace命令会将SQL执行的整个过程输出到一个trace文件中,我们可以通过阅读这个trace文件来了解这个SQL执行过程中oracle究竟做了哪些事情。
SQL是如何操作数据的。
SQL执行过程中产生了那些等待时间。
SQL执行中消耗了多少资源。
SQL的实际执行计划。
SQL产生的递归语句。
10046事件并不是oracle官方提供给用户的使用命令,但目前已经使用非常广泛,它比sql_trace能够获得更多的信息。
10046事件按照收集的信息内容,可以分为4个级别:
Level1 等同于sql_trace的功能。
Level4 在level1的基础上增加收集绑定变量的信息。
Level8 在level1的基础上增加等待事件的信息。
Level12 等同于level4 + level8 。
sql trace和10046原始trace文件内容解析:
PARSING IN CURSOR 部分
len: 被分析SQL的长度
dep: 产生递归SQL的深度
uid: user id
otc: oracle command type 命令类型
lid: 私有用户id
tim: 时间戳
hv: hash value
ad: SQL address
len: 被分析SQL的长度
dep: 产生递归SQL的深度
uid: user id
otc: oracle command type 命令类型
lid: 私有用户id
tim: 时间戳
hv: hash value
ad: SQL address
parse, exec, fetch部分
c: 消耗的cpu time
e: elapsed time 操作的用时
p: physical reads 物理读的次数
cr: consistent reads 一致性读的数据块
cu: current方式读的数据块
mis: cursor miss in cache 硬分析次数
r: rows处理的行数
dep: depth递归SQL的深度
og: optimizer goal优化器模式
tim: timstamp时间戳
stats 部分
id: 执行计划的行源号
cnt: 当前行源返回的行数
pid: 当前行源号的父号
pos: 执行计划中的位置
obj: 当前操作的对象id(如果当前行原始一个对象的话)
op: 当前行源的数据访问操作
id: 执行计划的行源号
cnt: 当前行源返回的行数
pid: 当前行源号的父号
pos: 执行计划中的位置
obj: 当前操作的对象id(如果当前行原始一个对象的话)
op: 当前行源的数据访问操作
经过tkprof格式化(对trace的原始文件分类统计)以后的格式解析:
分析(parse): SQL的分析阶段。--如语法检查,语义检查、权限检查,根据统计信息生成执行计划。
执行(execute): SQL的执行阶段。--如果是select语句,发现它没有做什么,如果是insert,update,delte,这一步骤就是最后一步。
数据提取(fetch): 数据的提取阶段。--只有select有这部,根据执行计划取数据(扫描数据,关联,返回数据)。
执行(execute): SQL的执行阶段。--如果是select语句,发现它没有做什么,如果是insert,update,delte,这一步骤就是最后一步。
数据提取(fetch): 数据的提取阶段。--只有select有这部,根据执行计划取数据(扫描数据,关联,返回数据)。
count: 计数器,表示当前的操作被执行了多少次。
cpu: 当前的操作消耗CPU的时间(单位秒)。
elapsed: 当前的操作一共用时多少(包括CPU和等待时间) 。
disk: 当前操作的物理读(磁盘I/O次数) 。
query: 当前操作的一致性方式读取的数据块数(通常是查询使用的方式) 。
current:当前操作的current的方式读取的数据块数(通常是修改数据使用的方式) 。
rows: 当前操作处理的数据记录数。
cpu: 当前的操作消耗CPU的时间(单位秒)。
elapsed: 当前的操作一共用时多少(包括CPU和等待时间) 。
disk: 当前操作的物理读(磁盘I/O次数) 。
query: 当前操作的一致性方式读取的数据块数(通常是查询使用的方式) 。
current:当前操作的current的方式读取的数据块数(通常是修改数据使用的方式) 。
rows: 当前操作处理的数据记录数。