SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。
1.在数据库级别开启trace
SQL> ALTER SYSTEM SET SQL_TRACE = TRUE;
SQL> ALTER SYSTEM SET SQL_TRACE = FALSE;
2.在当前SESSION设置trace
SQL> ALTER SESSION SET SQL_TRACE = TRUE;
SQL> ALTER SESSION SET SQL_TRACE = FALSE;
3.对其他Session进行trace
EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,FALSE);
EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,FALSE);
4.使用10046事件进行SQL的追踪
10046事件主要用来跟踪SQL语句,它并不是官方提供的命令,在官方文档上也找不到事件的说明信息,但是用的却比较多。10046事件获取SQL的信息比SQL_TRACE更多,更利于我们对SQL的判断。
10046事件按照收集信息内容,可以分为4个级别:
Level 1:等同与SQL_TRACE的功能
Level 4 : 在Level1基础上增加搜集绑定变量的信息
Level 8 : 在Level1基础上增加等待事件的信息
Level 12: 等同与Level4+Level 8,即同时收集绑定变量信息和等待时间信息
4.1 对当前session 启动10046事件
alter session set events '10046 trace name context forever, level 12';
4.2 对当前session 关闭 10046 事件
alter session set events '10046 trace name context off';
4.3 当其他session 启动 10046事件
exec dbms_monitor.session_trace_enable(147,128,waits=>true,binds=>true);
4.4 对其他session 关闭 10046事件
exec dbms_monitor.session_trace_disable(147,128);
如何获得当前session 的 SID,SERIAL#
SQL> SELECT SID,SERIAL# FROM V$SESSION WHERE SID IN (SELECT DISTINCT SID FROM V$MYSTAT);
SID SERIAL#
---------- ----------
144 11
如何获得生成的TRACE文件
select d.value || '\' || lower(rtrim(i.instance_name, chr(0))) || '_ora_' ||
p.spid || '.trc' trace_file_name
from (select p.spid
from v$mystat m,v$session s, v$process p
where m.statistic# = 1
and s.sid = m.sid
and p.addr = s.paddr) p,
v$instance i,
(select value from v$parameter where name = 'user_dump_dest') d
--另外一种查看方式:
select value from v$diag_info where name='Default Trace File';
将生成的TRACE 文件转换成易读格式
语法:
tkprof tracefile outputfile [optional | parameters ]
如:
tkprof E:\admin\ora10\udump\ora10_ora_4832.trc output= d:\10046.txt sys=no sort=prsela,exeela,fchela
参数和选项如下:
explain=scott/scott 表示用scott连接并进行执行计划分析。
sys=[yes/no]确定系统是否列出由sys用户产生或重调的sql语句
sort=sort_option按照指定的方法对sql trace的输出文件进行降序排序
sort_option选项
prscnt按解析次数排序
prscpu按解析所花cpu时间排序
prsela按解析所经历的时间排序
prsdsk按解析时物理的读操作的次数排序
prsqry按解析时以一致模式读取数据块的次数排序
prscu按解析时以当前读取数据块的次数进行排序
execnt按执行次数排序
execpu按执行时花的cpu时间排序
exeela按执行所经历的时间排序
exedsk按执行时物理读操作的次数排序
exeqry按执行时以一致模式读取数据块的次数排序
execu按执行时以当前模式读取数据块的次数排序
exerow按执行时处理的记录的次数进行排序
exemis按执行时库缓冲区的错误排序
fchcnt按返回数据的次数进行排序
fchcpu按返回数据cpu所花时间排序
fchela按返回数据所经历的时间排序
fchdsk按返回数据时的物理读操作的次数排序
fchqry按返回数据时一致模式读取数据块的次数排序
fchcu按返回数据时当前模式读取数据块的次数排序
fchrow按返回数据时处理的数据数量排序
tkprof输出文件各列的含义:(理解下面的含义对我们快速定位问题很有帮助)
parse:
将sql语句转换成执行计划,包括检查是否有正确的授权,需要到得表,列及其他引用到得对象是否存在,这些信息分别存在v$librarycache.v$rowcache..
execute
oracle实际执行的语句,如:insert,update,delete,这些会修改数据,对于select操作,这部只是确定选择的行数。
fetch
返回查询获得的行数,只有执行select会被收集。
Count
这个语句被parse,execute,fetch的次数的统计
Cpu
这个语句所有的parse,execute,fetch所用的cpu总的时间,以秒为单位。如果TIMED_STATISTICS 关闭的话,值为0。
Elapsed
这个语句所有的parse,execute,fetch所消耗的总的时间,以秒为单位。如果TIMED_STATISTICS 关闭的话,值为0。
Disk
这个语句所有的parse,execute,fetch从磁盘上的数据文件中读取的数据块的数量
Query
在一致性读的模式下,这个语句所有的parse,execute,fetch所获取的buffer数量(这部分是从内存读取的也就是逻辑读取的,相当于执行计划里的consistent gets)
Current
在current模式下,这个语句所有的parse,execute,fetch所获取的buffer数量,一般是current模式下发生的delect,insert,update的操作都会获取buffer。
Rows
语句返回的行数,不包括子查询中返回的记录数目。对于select语句,返回在fetch这步,对于insert,delete,update操作,返回记录是在execute这步。
总之,当SQL语句操作出现性能问题时,我们可以用SQL_TRACE 或者10046事件进行跟踪是最合适的。 如果是数据库整体性能下降,就需要使用statspack或者AWR对数据库进行分析。
本文参考: http://blog.csdn.net/tianlesoftware/article/details/5857023
相关推荐
在Oracle 10g及之前的版本,TRACE文件默认存储在`$ORACLE_BASE/admin/SID/ump`目录下;而在11g及更高版本,存储路径通常是`$ORACLE_BASE/diag/rdbms/orcl/orcl/trace`。 三、查询TRACE文件路径 可以运行以下SQL查询...
这是因为 WebLogic 服务器为了更好地管理和操作数据库连接,会使用自己的包装类 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 来表示 CLOB 类型的数据,而不是直接使用 Oracle 提供的标准 `oracle.sql.CLOB` 类。...
- 若要对特定会话启用 SQL Trace,可以使用 `dbms_system.set_sql_trace_in_session` 函数,这需要知道目标会话的 SID 和 SERIAL#。 ```sql EXECUTE dbms_system.set_sql_trace_in_session(sid, serial#, true); ...
如何使用oracle提供的SQL_TRACE来跟踪sql的执行情况?Sql性能非常差的时候,oracle提供了SQL_TRACE来跟踪sql的执行情况。注:分析sql的方式比较多,还有根据优化器、sql执行计划来分析。SQL_TRACE能够将sql执行的过程...
本文将基于"oracle_commond.rar_odbc api_oracle_oracle 客户端_oracle sql_sql"这一主题,深入探讨Oracle数据库的相关知识,包括ODBC API、Oracle客户端工具以及SQL在Oracle中的应用。 1. ODBC API(Open Database...
标签中的"ado_oracle_sql oracle_ado_ universal"进一步强调了ADO在与Oracle数据库和SQL操作中的应用,以及工具的通用性。 压缩包内的文件名列表提供了关于项目结构的线索: 1. "QryTool.aps":这可能是Visual ...
Oracle_Sql_Pl_Sql_性能优化.doc Oracle_Sql_Pl_Oracle_Sql_Pl_Sql_性能优化.docSql_性能优化.doc Oracle_Sql_Pl_Sql_性能优化.doc
`oracle_总结`标签提示,这份资料可能是对Oracle数据库使用和管理的关键知识点的汇总,可能包括表的创建、索引的使用、事务管理、视图的创建与应用、数据库备份与恢复策略等。数据库性能优化也是Oracle管理的重要...
在“Oracle-SQL.rar”这个压缩包中,包含了一份名为“Oracle SQL.ppt”的文件,这可能是一个PowerPoint演示文稿,用于详细讲解Oracle数据库的基础知识和SQL语言的使用。下面,我们将深入探讨一些Oracle SQL的基础...
ORACLE_FAQ中是itpub高手的多年经验总结出来的oracle开发的经典资料,包括pl-sql技巧,oracle体系架构,oracle备份与恢复,oracle优化,不同O/S上的开发,网络开发等
Oracle PL/SQL是Oracle数据库系统中的重要组成部分,它是一种结合了SQL查询语言和过程化编程元素的编程语言,专门用于在Oracle环境中进行数据库管理和应用程序开发。这个“Oracle PL-SQL.rar”压缩包提供了针对初学...
在Oracle数据库管理中,SQL调优是提升系统性能的关键环节。SQL_Tuning是Oracle官方提供的一个专题,旨在帮助管理员和开发人员优化SQL查询,从而提高数据库的效率和响应时间。以下是一些关于"Oracle SQL Tuning"的...
在Oracle中,动态SQL是一种重要的编程技术,尤其在处理不确定或在运行时才能确定的SQL语句时,它显得尤为关键。本文将深入探讨动态SQL的使用及其在级联删除中的应用。 首先,让我们理解什么是动态SQL。在静态SQL中...
这个压缩包文件"Oracle_Database_11g_SQL_-_Master_SQL_and_PLSQL_in_the_Oracle_Database"似乎包含了一本关于掌握Oracle 11g SQL和PL/SQL的教程资料。 SQL(结构化查询语言)是用于管理和操作数据库的标准语言,而...
Oracle_SQL_实用基础教程
标题 "9781782179672_code_oraclesql_" 暗示这可能是一个关于Oracle SQL编程的代码集合,可能源自一本技术书籍或教程资源。描述 "Scripts example Oracle SQL code" 表明这个压缩包包含了一系列Oracle SQL的脚本示例...
标题和描述中提到的"MySQL_for_JDBC"、"Oracle9i_for_JDBC"、"SQL_2000_for_JDBC"以及"SQL_2005_for_JDBC"都是针对不同数据库系统的Java JDBC驱动程序。JDBC(Java Database Connectivity)是Java编程语言中的一个...
Oracle DBA指南+10G备份与恢复+Oracle_DBA_数据库日常维护手册_常用SQL_脚本
oracle sqlt工具脚本,用来使用sql_profile绑定内存中已有的执行计划