Tkprof工具介紹和分析[轉]]

zhouxianwang發表於2013-01-26

Tkprof工具介紹和分析

Tkprof是一個用於分析Oracle跟蹤檔案並且產生一個更加清晰合理的輸出結果的可執行工具。如果一個系統的執行效率比較低,一個比較好的方法是透過跟蹤使用者的會話並且使用Tkprof工具使用排序功能格式化輸出,從而找出有問題的SQL語句。


Tkprof命令後面可以帶各種型別的排序選項,具體如下:

Usage: tkprof tracefile outputfile [explain= ] [table= ]

  [print= ] [insert= ] [sys= ] [sort= ]

  table=schema.tablename   Use 'schema.tablename' with 'explain='

option.

  explain=user/password    Connect to ORACLE and issue EXPLAIN PLAN.

  print=integer    List only the first 'integer' SQL statements.

  aggregate=yes|no

  insert=filename  List SQL statements and data inside INSERT

statements.

  sys=no           TKPROF does not list SQL statements run as user SYS.

  record=filename  Record non-recursive statements found in the

trace file.

  waits=yes|no     Record summary for any wait events found in the

trace file.

  sort=option      Set of zero or more of the following sort options:

  prscnt  number of times parse was called

  prscpu  cpu time parsing

  prsela  elapsed time parsing

  prsdsk  number of disk reads during parse

  prsqry  number of buffers for consistent read during parse

  prscu   number of buffers for current read during parse

  prsmis  number of misses in library cache during parse

  execnt  number of execute was called

  execpu  cpu time spent executing

  exeela  elapsed time executing

  exedsk  number of disk reads during execute

  exeqry  number of buffers for consistent read during execute

  execu   number of buffers for current read during execute

  exerow  number of rows processed during execute

  exemis  number of library cache misses during execute

  fchcnt  number of times fetch was called

  fchcpu  cpu time spent fetching

  fchela  elapsed time fetching

  fchdsk  number of disk reads during fetch

  fchqry  number of buffers for consistent read during fetch

  fchcu   number of buffers for current read during fetch

  fchrow  number of rows fetched

  userid  userid of user that parsed the cursor

其中比較有用的一個排序選項是fchela,即按照elapsed time fetching來對分析的結果排序(記住要設定初始化引數time_statistics=true),生成的.prf檔案將把最消耗時間的sql放在最前面顯示。另外一個有用的引數就是sys, 這個引數設定為no可以阻止所有以sys使用者執行的sql被顯示出來,這樣可以減少分析出來的檔案的複雜度,便於檢視。

    Tkprof命令輸出的解釋:

首先解釋輸出檔案中列的含義:

Ø         CALL:每次SQL語句的處理都分成三個部分

      Parse:這步將SQL語句轉換成執行計劃,包括檢查是否有正確的授權和所需要用到的表、列以及其他引用到的物件是否存在。

      Execute:這步是真正的由Oracle來執行語句。對於insertupdatedelete操作,這步會修改資料,對於select操作,這步就只是確定選擇的記錄。

      Fetch:返回查詢語句中所獲得的記錄,這步只有select語句會被執行。

Ø         COUNT:這個語句被parseexecutefetch的次數。

Ø         CPU:這個語句對於所有的parseexecutefetch所消耗的cpu的時間,以秒為單位。

Ø         ELAPSED:這個語句所有消耗在parseexecutefetch的總的時間。

Ø         DISK:從磁碟上的資料檔案中物理讀取的塊的數量。一般來說更想知道的是正在從快取中讀取的資料而不是從磁碟上讀取的資料。

Ø         QUERY:在一致性讀模式下,所有parseexecutefetch所獲得的buffer的數量。一致性模式的buffer是用於給一個長時間執行的事務提供一個一致性讀的快照,快取實際上在頭部儲存了狀態。

Ø         CURRENT:在current模式下所獲得的buffer的數量。一般在current模式下執行insertupdatedelete操作都會獲取buffer。在current模式下如果在快取記憶體區發現有新的快取足夠給當前的事務使用,則這些buffer都會被讀入了快取區中。

Ø         ROWS: 所有SQL語句返回的記錄數目,但是不包括子查詢中返回的記錄數目。對於select語句,返回記錄是在fetch這步,對於insertupdatedelete操作,返回記錄則是在execute這步。

   Tkprof的使用步驟基本上遵循以下幾步:

1.  在資料庫級別上設定TIMED_STATISTICSTrue

8i資料庫需要修改init檔案增加TIMED_STATISTICStrue,然後重啟資料庫使其生效。

9i資料庫可以直接修改:

SQL> alter system set timed_statistics=false scope=both;

系統已更改。

2.  使用各種的工具得到你想要檢視sessiontrace

Oracle中能夠得到一個sessiontrace的方法很多,這裡大致的都介紹一下。

方法一:如果需要在資料庫級別上設定trace,可以在init.ora檔案中加入sql_trace=true,這樣在資料庫執行的同時會trace所有資料庫的活動,一般來說,只有在資料庫的所有事務都需要被監控的時候才使用這種方法,使用這種方法會產生大量的trace檔案,此引數是需要重啟資料庫才可以生效的。Trace資訊收集完成後,記得去掉這個引數,然後重啟資料庫。

方法二:如果需要在session級別上設定trace,可以在sqlplus中使用下列語句:

SQL> alter session set sql_trace=true;

會話已更改。

如果要PL/SQL中對session級別上設定trace,可以使用dbms_session這個包:

SQL>exec dbms_system.set_sql_trace_in_session(sid

serial#,true);

PL/SQL 過程已成功完成。

3.  找到生成的正確的trace檔案,在init.ora初始化引數檔案中   user_dump_dest定義的路徑下可以找到。

4.  trace檔案使用tkprof工具進行分析。

   tkprof tracefile outfile [explain=user/password] [options...]

 一般來說,使用tkprof得到的輸出檔案中包含三個部分:

Ø         SQL語句本身。

Ø         相關的診斷資訊,包括cpu時間、總共消耗的時間、讀取磁碟數量、邏輯讀的數量、以及查詢中返回的記錄數目。

Ø         列出這個語句的執行計劃。

下面用一個具體的例子來說明如何利用tkprof來分析trace檔案。

先從os上利用top命令找到當前佔用cpu資源最高的一個程式的PID號:14483

load averages:  1.53,  1.37,  1.39 db2     23:11:15

246 processes: 236 sleeping, 1 running, 2 zombie, 4 stopped, 3 on cpu

CPU states: 68.0% idle, 17.3% user,  3.0% kernel, 11.6% iowait,  0.0% swap

Memory: 16.0G real, 3.4G free, 9.7G swap in use, 11.0G swap free

   PID USERNAME THR PR NCE  SIZE   RES STATE   TIME FLTS    CPU COMMAND

 14483 oracle     1 51   0  8.8G  8.8G sleep  77.1H    1  5.69% oracle

 28222 oracle     1 52   0  8.8G  8.8G cpu18  93:55 2742  3.32% oracle

  3722 oracle     1 59   0  8.8G  8.8G sleep 157:41    0  0.45% oracle

 16077 oracle     1 59   0  8.8G  8.8G sleep  17.1H    0  0.34% oracle

 12687 oracle     1 59   0  8.8G  8.8G sleep   0:07    0  0.29% oracle

 17781 oracle     1 49   0  8.8G  8.8G run    91:11    8  0.24% oracle

  2359 oracle     1 59   0  8.8G  8.8G cpu19 524:53    0  0.12% oracle

  6559 oracle     1 59   0  8.8G  8.8G sleep 237:41    0  0.10% oracle

  2242 oracle     1 59   0  8.8G  8.8G sleep 980:56    0  0.09% oracle

  2356 oracle     1 59   0  8.8G  8.8G sleep 121:31    0  0.08% oracle

 16106 oracle     1 59   0  8.8G  8.8G sleep 168:44    0  0.05% oracle

 11432 oracle     1 49   0 2576K 1680K cpu11   0:11    0  0.05% top

  2333 oracle     1 59   0  8.9G  8.8G sleep 159:03    0  0.05% oracle

  2321 oracle     1 59   0  8.8G  8.8G sleep  78:20    0  0.04% oracle

  2282 oracle     1 59   0  8.8G  8.8G sleep 424:57    0  0.03% oracle

然後在資料庫中根據PID號找到相應的sid號和serial#

SQL> select s.sid,s.serial# from v$session s,v$process p

  2  where s.paddr=p.addr and p.spid='14483';

       SID    SERIAL#

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

       101      25695

使用dbms_system.set_sql_trace_in_session包來對這個session進行trace

SQL> exec DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(101,25695,true);

PL/SQL procedure successfully completed.

user_dump_dest定義的路徑下查詢剛剛最近生成的trace檔案,根據時間來排序,找最近的trace檔案,接著使用tkprof工具對此trace檔案進行格式化分析,生成分析後的trace檔案。

$tkprof orcl_ora_14483.trc allan.txt explain=system/manager aggregate=yes sys=no waits=yes sort=fchela

TKPROF: Release 9.2.0.4.0 - Production on Sun Dec 5 22:27:28 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

這裡生成的allan.txt檔案就是我們最終得到的格式化後的trace檔案了,然後開啟這個檔案進行分析。

一、首先tkprof工具輸出的最後總的統計:

OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows

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

Parse       20      0.01       0.02          0         58          0           0

Execute  13197     0.81       0.90         17       7436       6316        1484

Fetch    12944     22.86      22.10         20    2205941          0        8972

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

total    26161     23.68      23.02         37    2213435       6316       10456<



source:http://blog.itpub.net/post/3/10525

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27036311/viewspace-753357/,如需轉載,請註明出處,否則將追究法律責任。

相關文章