2013-08-07 星期三 下午


--------------SQL跟踪方法----------------------

SQL TRACE


SQL> conn hr/hr

Connected.

SQL> alter session set sql_trace=true;


Session altered.


SQL> select * from t1 where id=100;


       ID NAME

---------- ----------

      100 T1


SQL> select * from t2 where id=100;


       ID NAME

---------- ----------

      100 T2


SQL> alter session set sql_trace=false;


Session altered.



---==========plan表的使用===============


在同一个会话中执行下面的两个SQL:


explain plan for select * from t1 where id=100

select * from plan_table   这个表是个全局临时表,解释完之后在当前会话查询执行计划表的内容

                          跟踪文件按照既定的规则,将内容装入到plan_table,再显示在autotrace工具中。


打开最近的跟踪文件进行查看:


*** 2013-08-07 14:07:58.625

*** ACTION NAME:() 2013-08-07 14:07:58.576

*** MODULE NAME:(SQL*Plus) 2013-08-07 14:07:58.576

*** SERVICE NAME:(SYS$USERS) 2013-08-07 14:07:58.576

*** SESSION ID:(352.90) 2013-08-07 14:07:58.576

=====================

PARSING IN CURSOR #2 len=29 dep=0 uid=55 oct=3 lid=55 tim=1343609061110110 hv=2732024291 ad='69447274'

select * from t1 where id=100  --执行的SQL语句

DML语句就是一个隐式游标,

#2——游标的编号

len——SQL语句的长度,29字节

dep——SQL语句解析的深度,0表示第一层

uid——用户ID,哪个用户执行的SQL,select * from dba_users where user_id=55

oct——oracle command type,当前的类型是3

lid——私有用户。当前用户下执行,UID=LID

tim——厘秒单位表示的时间戳

hv——hash value——SQL语句的hash value,select * from v$sqlarea where hash_value='2732024291'查询得出

ad——address SQL语句在库缓存中驻留的物理地址   select * from v$sqlarea where address='69447274'查询得出


END OF STMT


-------------解析阶段------------

PARSE #2:c=1999,e=23433,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1343609061110094


c——消耗CPU的时间,单位:毫秒

e——逃离时间,整个过程消耗的时间:elapse time = wait time + cpu time

p——物理读次数

cr——consistent read——一致性读

cu——db block gets——当前读

mis——解析的次数,错过库缓存的次数

r——取到的行数

dep——SQL语句的深度

og——optimizer mode优化器的模式 1=CBO

tim——解析的时间戳

---------------执行阶段--------------------------

EXEC #2:c=0,e=4446,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1343609061168722



---------------取数阶段----------------------------

FETCH #2:c=0,e=156,p=0,cr=3,cu=0,mis=0,r=1,dep=0,og=1,tim=1343609061168971   --扫表

FETCH #2:c=0,e=1,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343609061169283     --扫索引


cr=3  等同于       3  consistent gets


----------------统计阶段--------------------------------

STAT #2 id=1 cnt=1 pid=0 pos=1 obj=56498 op='TABLE ACCESS BY INDEX ROWID T1 (cr=3 pr=0 pw=0 time=150 us)'

STAT #2 id=2 cnt=1 pid=1 pos=1 obj=56499 op='INDEX UNIQUE SCAN SYS_C006531 (cr=2 pr=0 pw=0 time=129 us)'


id——执行计划中的ID

cnt——执行计划中的Rows

pid——父亲节点

pos——左右位置,pos=1表示作左孩子,POS=2表示右孩子

obj——访问的对象,select * from dba_objects where data_object_id in(56498,56499)

op——operation——数据访问的方式

cr——一致性读

pr——物理读

pw——物理写

time——时间


=====================

PARSING IN CURSOR #1 len=29 dep=0 uid=55 oct=3 lid=55 tim=1343609067332993 hv=2555944085 ad='69446bb8'


select * from t2 where id=100

END OF STMT

PARSE #1:c=2000,e=1998,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1343609067332983  --解析了一次

EXEC #1:c=0,e=49,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1343609067333143

FETCH #1:c=999,e=326,p=0,cr=4,cu=0,mis=0,r=1,dep=0,og=1,tim=1343609067333690

FETCH #1:c=0,e=2,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343609067334213

STAT #1 id=1 cnt=1 pid=0 pos=1 obj=56500 op='TABLE ACCESS BY INDEX ROWID T2 (cr=4 pr=0 pw=0 time=318 us)'

STAT #1 id=2 cnt=1 pid=1 pos=1 obj=56501 op='INDEX UNIQUE SCAN SYS_C006532 (cr=3 pr=0 pw=0 time=266 us)'

=====================

PARSING IN CURSOR #2 len=33 dep=0 uid=55 oct=42 lid=55 tim=1343609071532155 hv=525901419 ad='0'

alter session set sql_trace=false

END OF STMT

PARSE #2:c=0,e=232,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343609071532147

EXEC #2:c=0,e=16,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1343609071532257



SQL> select * from t1 where id=100;



Execution Plan

----------------------------------------------------------

Plan hash value: 1846342996


-------------------------------------------------------------------------------------------

| Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |

-------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |             |     1 |     6 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| T1          |     1 |     6 |     2   (0)| 00:00:01 |

|*  2 |   INDEX UNIQUE SCAN         | SYS_C006531 |     1 |       |     1   (0)| 00:00:01 |

-------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):

---------------------------------------------------


  2 - access("ID"=100)



Statistics

----------------------------------------------------------

         0  recursive calls

         0  db block gets

         3  consistent gets

         0  physical reads

         0  redo size

       462  bytes sent via SQL*Net to client

       400  bytes received via SQL*Net from client

         2  SQL*Net roundtrips to/from client

         0  sorts (memory)

         0  sorts (disk)

         1  rows processed


=================================


将跟踪文件转华为一个report:可读性强。


[oracle@oracle253 udump]$ tkprof orcl_ora_6110 orcl_ora_6110.txt


TKPROF: Release 10.2.0.4.0 - Production on Wed Aug 7 14:35:13 2013


Copyright (c) 1982, 2007, Oracle.  All rights reserved.



--打开文件


Trace file: orcl_ora_6110.trc

Sort options: default


********************************************************************************

count    = number of times OCI procedure was executed

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

current  = number of buffers gotten in current mode (usually for update)

rows     = number of rows processed by the fetch or execute call

********************************************************************************


select *

from

t1 where id=100



call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.02          0          0          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        2      0.00       0.00          0          3          0           1

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        4      0.00       0.02          0          3          0           1


参数说明:

 call——调用的类型

 count——类型对应的次数

 cpu——消耗CPU的时间

 elapsed——逃离时间

 disk——物理读块次数

 query——一致性读块次数

 current——当前读次数

 rows——返回的行数


----------------------------------------------------

Misses in library cache during parse: 1  解析了一次

Optimizer mode: ALL_ROWS

Parsing user id: 55  


Rows     Row Source Operation

-------  ---------------------------------------------------

     1  TABLE ACCESS BY INDEX ROWID T1 (cr=3 pr=0 pw=0 time=150 us)

     1   INDEX UNIQUE SCAN SYS_C006531 (cr=2 pr=0 pw=0 time=129 us)(object id 56499)


********************************************************************************


select *

from

t2 where id=100



call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          0          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.00       0.00          0          4          0           1


Misses in library cache during parse: 1

Optimizer mode: ALL_ROWS

Parsing user id: 55  


Rows     Row Source Operation

-------  ---------------------------------------------------

     1  TABLE ACCESS BY INDEX ROWID T2 (cr=4 pr=0 pw=0 time=318 us)

     1   INDEX UNIQUE SCAN SYS_C006532 (cr=3 pr=0 pw=0 time=266 us)(object id 56501)


********************************************************************************


alter session set sql_trace=false


********************************************************************************  汇总


OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS  --非递归调用部分,用户自己执行的SQL语句消耗的统计


call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        3      0.00       0.02          0          0          0           0

Execute      3      0.00       0.00          0          0          0           0

Fetch        4      0.00       0.00          0          7          0           2

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total       10      0.00       0.03          0          7          0           2


Misses in library cache during parse: 2



OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS  --递归调用,由用户SQL引发的底层的SQL执行的消耗的统计


call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        0      0.00       0.00          0          0          0           0

Execute      0      0.00       0.00          0          0          0           0

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        0      0.00       0.00          0          0          0           0


Misses in library cache during parse: 0


   3  user  SQL statements in session.

   0  internal SQL statements in session.

   3  SQL statements in session.

********************************************************************************


硬解析:

1、作递归调用,为执行计划准备数据。

2、解析这个SQL语句生成执行计划


-------------------------------------------

将缓存清除掉后再看这个过程:


SQL> conn /as sysdba

Connected.

SQL> alter system flush buffer_cache;


System altered.


SQL> alter system flush shared_pool;


System altered.


SQL> conn hr/hr

Connected.

SQL> alter session set sql_trace=true;


Session altered.


SQL> select * from t1 where id=100;


       ID NAME

---------- ----------

      100 T1


SQL> select * from t2 where id=100;


       ID NAME

---------- ----------

      100 T2


SQL> alter session set sql_trace=false;


Session altered.



[oracle@oracle253 udump]$ tkprof orcl_ora_6813 orcl_ora_6813.txt


TKPROF: Release 10.2.0.4.0 - Production on Wed Aug 7 14:42:45 2013


Copyright (c) 1982, 2007, Oracle.  All rights reserved.


前面递归调用的文本省略。。。。。


看到很对看不懂的SQL语句的解析过程,这个就是CBO优化器数学模型在运算过程中留下的痕迹。


********************************************************************************


select *

from

t1 where id=100



call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.02       0.04         13         50          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        2      0.00       0.01          3          3          0           1

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        4      0.03       0.05         16         53          0           1


disk次数不为0。



Misses in library cache during parse: 1   --做了硬解析

Optimizer mode: ALL_ROWS

Parsing user id: 55  


Rows     Row Source Operation

-------  ---------------------------------------------------

     1  TABLE ACCESS BY INDEX ROWID T1 (cr=3 pr=3 pw=0 time=10294 us)

     1   INDEX UNIQUE SCAN SYS_C006531 (cr=2 pr=2 pw=0 time=9960 us)(object id 56499)


********************************************************************************


select *

from

t2 where id=100



call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.01       0.01          1         50          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        2      0.00       0.01          4          4          0           1

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        4      0.01       0.02          5         54          0           1


Misses in library cache during parse: 1

Optimizer mode: ALL_ROWS

Parsing user id: 55  


Rows     Row Source Operation

-------  ---------------------------------------------------

     1  TABLE ACCESS BY INDEX ROWID T2 (cr=4 pr=4 pw=0 time=10313 us)

     1   INDEX UNIQUE SCAN SYS_C006532 (cr=3 pr=3 pw=0 time=10239 us)(object id 56501)


********************************************************************************


alter session set sql_trace=false



call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        1      0.00       0.00          0          0          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        0      0.00       0.00          0          0          0           0

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total        2      0.00       0.00          0          0          0           0


Misses in library cache during parse: 0

Parsing user id: 55  


********************************************************************************


OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS


call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse        3      0.04       0.05         14        100          0           0

Execute      3      0.00       0.00          0          0          0           0

Fetch        4      0.00       0.02          7          7          0           2

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total       10      0.04       0.07         21        107          0           2


Misses in library cache during parse: 2



OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS   --递归调用现在有值了。


call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  ----------

Parse       28      0.00       0.00          0          0          0           0

Execute     30      0.01       0.01          0          0          0           0

Fetch       42      0.00       0.01         14        100          0          26

------- ------  -------- ---------- ---------- ---------- ----------  ----------

total      100      0.03       0.04         14        100          0          26


Misses in library cache during parse: 13

Misses in library cache during execute: 13


   3  user  SQL statements in session.

  30  internal SQL statements in session.

  33  SQL statements in session.

********************************************************************************


可以根据SQL TRACE和 TKPROF工具看到一个SQL语句在底层的消耗,包括CPU和IO的消耗,


这样我们能清晰的看到SQL语句的性能问题。