TKPROF是一個可執行檔案,自帶在Oracle Server軟體中,無需額外的安裝。 該工具檔案可以用來解析ORACLE的SQL TRACE(10046) 以便生成更可讀的内容。 實際上tkprof是對10046 SQL trace的内容作了彙總,例如一個語句遇到過的wait event 、其在PARSE、Execute、Fetch三階段的耗時、CPU_TIME等等。
由于tkprof是對10046 SQL TRACE的彙總,是以tkprof中的資訊 完全可以從10046中獲得, 10046的問題是 由于巨細靡遺 是以TRACE内容可能過多,内容多則難以快速分析, TKPROF将10046 trace 解析過後更适合調優者閱讀。
基本步驟:
1、設定TIMED_STATISTICS為True,可以在會話級别,也可以在執行個體級别。
會話級:
SQL> alter session set timed_statistics=True;
執行個體級:
SQL> alter system set timed_statistics=True scope=both;
2、 設定SQL_TRACE,可以在會話級,也可以在資料庫級。
SQL> alter session set sql_trace=true;
或者:
SQL>EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,TRUE);
SQL> alter system set sql_trace=true scope=both;
舉例說明:
下面有兩個例子:
一,分析sql_trace跟蹤檔案
二,分析會話的跟蹤檔案
第一,分析sql_trace跟蹤檔案
SQL> alter session set sql_trace=true;
Session altered.
SQL> select count(*) from t;
COUNT(*)
----------
250734
SQL> alter session set timed_statistics=true;
SQL> alter session set sql_trace =false;
檢視生成的trace檔案
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 = m.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
/
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/diag/rdbms/db11/db112/trace/db112_ora_7677.trc
使用tkprof分析trace檔案
db112@dbrac2 /home/oracle$ tkprof /u01/app/oracle/diag/rdbms/db11/db112/trace/db112_ora_7677.trc db112_ora_7677.txt aggregate=yes sys=no waits=yes sort=fchela
檢視輸出的檔案
db112@dbrac2 /home/oracle$ cat db112_ora_7677.txt
TKPROF: Release 11.2.0.1.0 - Development on Wed Feb 19 22:13:19 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Trace file: /u01/app/oracle/diag/rdbms/db11/db112/trace/db112_ora_7677.trc
Sort options: fchela
********************************************************************************
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
SQL ID: cyzznbykb509s
Plan Hash: 2966233522
select count(*)
from
t
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.00 0.00 0 0 0 0
Execute 2 0.00 0.00 0 0 0 0
Fetch 4 0.09 1.51 7294 7298 0 2
total 8 0.09 1.52 7294 7298 0 2
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 127
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=3649 pr=3647 pw=0 time=0 us)
250734 TABLE ACCESS FULL T (cr=3649 pr=3647 pw=0 time=67962 us cost=994 size=0 card=250734)
SQL ID: 4tk6t8tfsfqbf
Plan Hash: 0
alter session set sql_trace=true
Parse 0 0.00 0.00 0 0 0 0
Execute 1 0.00 0.04 7 56 0 0
Fetch 0 0.00 0.00 0 0 0 0
total 1 0.00 0.04 7 56 0 0
Misses in library cache during parse: 0
Misses in library cache during execute: 1
SQL ID: dqcjr8t9drmkw
alter session set sql_trace =false
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
total 2 0.00 0.00 0 0 0 0
SQL ID: cf0ac3jj8sa1c
alter session set timed_statistics=true
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS
Parse 4 0.00 0.00 0 0 0 0
Execute 5 0.00 0.04 7 56 0 0
total 13 0.10 1.57 7301 7354 0 2
Misses in library cache during parse: 2
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
Parse 11 0.01 0.02 0 0 0 0
Execute 227 0.07 0.13 0 0 0 0
Fetch 242 0.01 0.25 39 728 0 2129
total 480 0.10 0.41 39 728 0 2129
Misses in library cache during parse: 10
Misses in library cache during execute: 10
5 user SQL statements in session.
227 internal SQL statements in session.
232 SQL statements in session.
Trace file compatibility: 11.1.0.7
2 sessions in tracefile.
5 user SQL statements in trace file.
227 internal SQL statements in trace file.
232 SQL statements in trace file.
15 unique SQL statements in trace file.
1760 lines in trace file.
34 elapsed seconds in trace file.
下面這個例子來自于Maclean
先從os上利用top指令找到目前占用cpu資源最高的一個程序的PID号:14483
然後在資料庫中根據PID号找到相應的sid号和serial#:
SQL> select s.sid,s.serial# from v$session s,v$process p 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檔案,也可以根據SID_ORA_SPID.TRC的規則,即ORCL_ORA_14483.TRC找到TRACE檔案。
接着使用tkprof工具對此trace檔案進行格式化分析,生成分析後的trace檔案。
通過tkprof分析檔案
tkprof db112_mmnl_20698.trc ~/20698.txt explain=system/oracle aggregate=yes sys=no waits=yes sort=fchela
對Tkprof指令輸出的解釋:
首先解釋輸出檔案中列的含義:
CALL:每次SQL語句的處理都分成三個部分
Parse:這步将SQL語句轉換成執行計劃,包括檢查是否有正确的授權和所需要用到的表、列以及其他引用到的對象是否存在。
Execute:這步是真正的由Oracle來執行語句。對于insert、update、delete操作,這步會修改資料,對于select操作,這步就隻是确定選擇的記錄。
Fetch:傳回查詢語句中所獲得的記錄,這步隻有select語句會被執行。
COUNT:這個語句被parse、execute、fetch的次數。
CPU:這個語句對于所有的parse、execute、fetch所消耗的cpu的時間,以秒為機關。
ELAPSED:這個語句所有消耗在parse、execute、fetch的總的時間。
DISK:從磁盤上的資料檔案中實體讀取的塊的數量。一般來說更想知道的是正在從緩存中讀取的資料而不是從磁盤上讀取的資料。
QUERY:在一緻性讀模式下,所有parse、execute、fetch所獲得的buffer的數量。一緻性模式的buffer是用于給一個長時間運作的事務提供一個一緻性讀的快照,緩存實際上在頭部存儲了狀态。
CURRENT:在current模式下所獲得的buffer的數量。一般在current模式下執行insert、update、delete操作都會擷取buffer。在current模式下如果在高速緩存區發現有新的緩存足夠給目前的事務使用,則這些buffer都會被讀入了緩存區中。
ROWS: 所有SQL語句傳回的記錄數目,但是不包括子查詢中傳回的記錄數目。對于select語句,傳回記錄是在fetch這步,對于insert、update、delete操作,傳回記錄則是在execute這步。
筆記