当你在执行一条SQL语句非常慢的时候,你是不是想问Oracle怎么执行这条语句的呢?
Oracle提供的SQL_TRACE工具可以让你知道你执行的SQL究竟做了什么.执行的过程会被
输出到trace文件中.
下面用例子来跟踪一个SQL语句的执行情况:
SQL> create table t as select rownum as id,object_name from dba_objects;
Table created.
SQL> create index t_ind on t(id);
Index created.
SQL> alter session set tracefile_identifier=‘mysession‘;
Session altered.
生成的trace文件的路径是$ORACLE_BASE/admin/SID/udump目录.
上面的语句是让生产trace文件名包括mysession,如本例中在
D:\oracle\product\10.2.0\admin\orcl\udump生成了orcl_ora_5732_mysession.trc
SQL> alter session set sql_trace=true;
Session altered.
SQL> select * from t where id=123;
ID OBJECT_NAME
123 I_ACCESS1
SQL> alter session set sql_trace=false;
Session altered.
一般来讲生成的trace文件比较难读,可以用tkprof来生成一个更可读的文件.
注意tkprof是Oracle带的一个命令行工具,不是SQLPLUS命令.
在另外一个命令行中进入D:\oracle\product\10.2.0\admin\orcl\udump目录
D:\oracle\product\10.2.0\admin\orcl\udump>tkprof orcl_ora_5732_mysession.trc orcl_ora_5732_mysession.txt
TKPROF: Release 10.2.0.1.0 - Production on Fri Sep 14 16:59:12 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
打开 orcl_ora_5732_mysession.txt文件,可以看到执行SQL的信息:
select *
from
t where id=123
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.04 0.30 0 2 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 4 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.04 0.30 0 6 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61
Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS BY INDEX ROWID T (cr=4 pr=0 pw=0 time=86 us)
1 INDEX RANGE SCAN T_IND (cr=3 pr=0 pw=0 time=67 us)(object id 57205)
********************************************************************************
对于每一条SQL语句,都包含3个步骤:
Parse:SQL的分析阶段.
Execute:SQL的执行阶段.
Fetch:数据提取阶段.(对于一次SQL操作,Fetch可能多次)
横向的标题头为:
count:当前的操作执行的次数.
cpu:当前操作消耗的CPU时间(秒).
elapsed:当前操作消耗的时间(CPU时间加等待时间).
disk:磁盘的IO次数.
query:当前操作的一致性读取的数据块数.
current:前操作的current读取的数据块数(通常在update操作时发生).
rows:处理的记录行数.
Misses in library cache during parse是指是不是重用了执行计划,如果同一条SQL语句第二次执行,
其值为零,这里是1,表示在共享池里没有这一条SQL的执行计划,发生了一次硬解析.
Optimizer:优化器模式.
Parsing user id:分析的用户ID.
Row Source Operation部分包含的实际消耗的资源.
cr:一致性读取的数据块,相当于Fetch的query.
pr:物理读, 相当于Fetch的disk.
pw:物理写.
time:当前操作的执行时间.
同时我们在trace文件里还会发现对系统表的访问的SQL,这就是通常说的递归SQL.
还可以利用10046事件来跟踪SQL,它比SQL_TRACE提供更详细的信息.它有LEVEL 1,4,8,12四个级别.
其中Level 1 相当于 SQL_TRACE.下面是10046使用的例子
SQL> alter session set events ‘10046 trace name context forever,level 4‘;
Session altered.
.... some SQL statements
SQL> alter session set events ‘10046 trace name context off‘;
Session altered.
oracle怎样开启sql跟踪
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle怎样开启sql跟踪相关的知识,希望对你有一定的参考价值。
一.在系统级别上设置sql跟踪该方法优点:可以跟踪所有的oracle的后台进程所执行的sql,包括系统后台进程和用户进程,并且可以跟踪所有的操作
缺点:跟踪所有的后台进程,跟踪信息量比较大
1.在sqlplus中以sys/ as sysdba身份登陆到数据库。
2.打开跟踪,在sqlplus中输入alter sysetem set events '10046 trace name context forever,level &level';
(其中&level可以输入1,4,8,12三个级别,不同的级别含有不同级别的信息)
3.然后到ArcMap或ArcCatalog中进行你想跟踪的操作
4.关闭跟踪,在sqlplus中输入alter systemm set events '10046 trace name context off';
5.查找你所跟踪的session的ID
A 修改时间格式:alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
B.对使用sde服务的输入:select sid,logon_time from v$session where username=&username and program='gsrvr.exe';
C.对直连这种方式输入:select sid,logon_time from v$session where username=&username and program='ArcCatalog';
select sid,logon_time from v$session where username=&username and program='ArcMap';
(其中&username是程序登陆到数据库的用户名,如果返回多个结果,在根据登陆的时间确定具体的sid值)
6.执行以下的sql语句
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, 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 = &SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d
在输入sid后,即得到后台的跟踪文件。
二. 在session级别上设置跟踪
该方法只适用于跟踪登陆数据后所进行的一系列的操作,比如跟踪在ArcCatalog中创建一个Dataset,FeatureClass等的操作
1.在sqlplus中以sys / as sysdba身份登陆到数据库
2.查找你所要跟踪的session的sid和serial#
A 修改时间格式:alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
B.对使用sde服务的输入:select sid,serial#,logon_time from v$session where username=&username and program='gsrvr.exe';
C.对直连这种方式输入:select sid,serial#,logon_time from v$session where username=&username and program='ArcCatalog';
select sid,serial#,logon_time from v$session where username=&username and program='ArcMap';
(其中&username是程序登陆到数据库的用户名,如果返回多个结果,在根据登陆的时间确定具体的sid和serial#的值)
3.开始跟踪,输入exec dbms_support.start_trace_in_session(&sid,&serial#,true,true).(如果系统没有安装dbms_support包,可以执行$ORACLE_HOME\rdbms\admin\dbmssupp.sql进行安装)
4.然后到ArcMap或ArcCatalog中进行你想跟踪的操作
5.结束跟踪exec dbms_support.stop_trace_in_session(&sid,&serial#);
6.执行以下的sql语句
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, 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 = &SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d
在输入sid后,即得到后台的跟踪文件。
三. 在Aix系统下跟踪消耗内存的session的办法
1.在Aix系统上执行export TERM=vt100
2.执行topas命令,确定最占cpu资源的process的进程号
3,然后利用select a.sid,b.serial# from v$session a,v$process b where a.paddr=b.addr and b.spid=&spid;
4.确定sid和serial#后利用二方法进行跟踪。 参考技术A set autotrace on
在Oracle中利用SQL_TRACE跟踪SQL的执行
以上是关于oracle怎样开启sql跟踪的主要内容,如果未能解决你的问题,请参考以下文章