首先,这篇文章分三部分进行总结,第一部分是对一些系统参数的查看,第二部分是对oracle trace的介绍,第三部分是讲解如何使用tkprof工具来对oracle trace文件进行分析。
1、查看系统参数
由于我个人比较喜欢使用pl/sql developer作为开发工具,哪怕是使用命令窗口,我也是直接使用的pl/sql developer的命令窗口,而不是使用oracle自带的sql*plus,所以下面的介绍都会是以pl/sql developer作为开发工具。下面都是进入命令窗口的操作:
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0
Connected as apps
SQL> show parameter timed_statistics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
timed_statistics boolean TRUE
SQL> show parameter sql_trace;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sql_trace boolean FALSE
SQL> show parameter user_dump_dest;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string /d01/oracle/VIS/db/tech_st/11.1.0/admin/VIS_syfdemo/diag/rdbms/vis/VIS/trace
其实,想要查看系统参数情况,可以直接使用show parameter来查看全部,但是这里不需要,这里大概只要知道上面这三个就OK了。
2、oracle trace讲解
oracle中的sql_trace主要是oracle提供的用于进行SQL跟踪的一种方法,是一个有效的辅助诊断工具。SQL_TRACE可以作为初始化参数在全局启用,也可以通过命令行在具体的session中启用。全局启用sql_trace这里暂且不论,下面介绍如何在session级启用sql_trace。session级启用命令如下:alter session set sql_trace = true;
很多时候,需要跟踪的不是当前用户的进程,而是其他用户,这时候可以通过系统提供的dbms_system.set_sql_trace_in_session来实现。set_sql_trace_in_session方法有三个参数,分别是sid、serial#以及true(或false),当为true时,表示启用跟踪,当为false时,表示跟踪关闭。sid和serial#可以通过查找v$session视图找到,也可以参照下v$process视图。示例如下,在命令窗口执行:
SQL> exec dbms_system.set_sql_trace_in_session(10, 223, true) -- 启用
SQL> exec dbms_system.set_sql_trace_in_session(10. 223, false) -- 停止
还有一种称为“10046事件”的玩意,也是和sql_trace相关,本文不做介绍,可在网上查找相关资料。
以上跟踪生成的文件都位于user_dump_dest目录中,本文的前面已经介绍了找到该路径的方法,下面提供查找相应的跟踪文件名的代码:
SELECT d.value || '/' || lower(rtrim(i.instance,
chr(0))) || '_ora_' || p.spid || '.trc' trace_file_name
FROM (SELECT p.spid
FROM sys.v$mystat m,
sys.v$session s,
sys.v$process p
WHERE m.statistic# = 1
AND s.sid = m.sid
AND p.addr = s.paddr) p,
(SELECT t.instance
FROM sys.v$thread t,
sys.v$parameter v
WHERE v.name = 'thread'
AND (v.value = 0 OR t.thread# = to_number(v.value))) i,
(SELECT VALUE
FROM sys.v$parameter
WHERE NAME = 'user_dump_dest') d
3、tkprof工具
tkprof是一个用于分析oracle跟踪文件并且产生一个更加清晰合理的输出结果的可执行工具。tkprof的使用步骤如下(简易版,复杂的这里不做介绍):
(1)在数据库级别上设置timed_statistics为true,如果已经设置为true了,这里就不用设置,前文已经介绍了查看方法。至于这么设置,可能不同版本的oracle有点不一样,我在网上找到的有9i的设置可以执行:alter system set timed_statistics=true scope=both;
(2)启用sql_trace,这里可直接参考上面第二部分的内容,这里只介绍session级别的sql_trace。根据第二部分的操作,启用跟踪,并且找到跟踪文件。
(3)找到跟踪文件以后,可以直接对文件进行处理,示例图如下图1:
图1:tkprof示例图
进入跟踪文件所在的目录,然后执行tkprof命令,然后就可以查看生成的txt文件(文件自定义,我定义成txt)来分析,至于如何分析,以及tkprof命令的高级应用,这里不展开,因为我目前也不太熟悉,待到以后有经验了再来总结,网上有一篇总结的比较详细,可以参考:http://www.cnblogs.com/songdavid/articles/2075798.html
下面列出一些tkprof生成文件中常看到的几个性能方面的数字:
count:表示执行的数据库调用数量。
cpu:表示处理数据调用花去的CPU时间,以秒为单位。
elapsed:表示处理数据库调用花费的总时间,以秒为单位。
disk:表示物理读的数据块数量。
query:表示在consistent mode下从高速缓存逻辑读取的块数量。
current:表示在当前模式下从高速缓存逻辑读取的块数量。
rows:表示处理的数据行数量。
图2:tnsnames.ora配置出错
另外,题外话一下,我在本机装了一个oracle数据库,刚刚才第一次使用pl/sql develper连接,结果出现“ORA-12154 TNS无法解析指定的连接标识符 ”,由于对这方面的配置我还是有点了解的,仔细都检查了一边,并且如上图1所示,我也通过tnsping了一下,发现没啥问题,应该是tnsnames.ora配置文件配置有错,果然,打开一看,如上图2所示,居然在前面多了个空格,这是在赋值配置信息的时候直接复制进来,也没有太做注意,后来删除空格以后,问题解决了