Tkprof是一個用於分析Oracle跟蹤文件而且產生一個更加清晰合理的輸出結果的可執行工具。若是一個系統的執行效率比較低,一個比較好的方法是經過跟蹤用戶的會話而且使用Tkprof工具使用排序功能格式化輸出,從而找出有問題的SQL語句。sql
一. TKPROF 命令語法:數據庫
TKPROF filename1, filename2 [ SORT = [opion][,option] ]緩存
[ PRINT = integer ]session
[AGGREGATE = [ YES | NO ] ]ide
[INSERT = filename3 ]工具
[SYS = [ YES | NO ] ]fetch
[ [ TABLE = schema.table ] | [EXPLAIN = user/password ] ]spa
[ RECORD = filename ]對象
相關說明:排序
filename1 指定的輸入文件,能夠是多個文件聯起來。
Filename2 格式化輸出文件。
SORT 在輸出到輸出文件前,先進程排序。若是省去,則按照實際使用的順序輸出到文件中。排序選項有如下多種:
prscnt number of times parse was called
prscpu cpu time parsing
prsela elapsed time parsing
prsdsk number of disk readsduring parse
prsqry number of buffers forconsistent read during parse
prscu number of buffers forcurrent read during parse
prsmis number of misses inlibrary cache during parse
execnt number of execute wascalled
execpu cpu time spent executing
exeela elapsed time executing
exedsk number of disk readsduring execute
exeqry number of buffers forconsistent read during execute
execu number of buffers forcurrent read during execute
exerow number of rows processedduring execute
exemis number of library cachemisses during execute
fchcnt number of times fetch wascalled
fchcpu cpu time spent fetching
fchela elapsed time fetching
fchdsk number of disk readsduring fetch
fchqry number of buffers forconsistent read during fetch
fchcu number of buffers forcurrent read during fetch
fchrow number of rows fetched
userid userid of user that parsedthe cursor
PRINT 只列出輸出文件的第一個integer 的SQL語句。默認爲全部的SQL語句。
AGGREGATE 若是= NO ,則不對多個相同的SQL進行彙總。
INSERT SQL 語句的一種,用於將跟蹤文件的統計信息存儲到數據庫中。在TKPROF建立腳本後,在將結果輸入到數據庫中。
SYS 禁止或啓用將SYS用戶所發佈的SQL語句列表到輸出文件中。
TABLE 在輸出到輸出文件前,用於存放臨時表的用戶名和表名。
EXPLAIN 對每條SQL 語句肯定其執行規劃。並將執行規劃寫到輸出文件中。
其中比較有用的一個排序選項是fchela,即按照elapsed time fetching來對分析的結果排序(記住要設置初始化參數timed_statistics=true),生成的文件將把最消耗時間的sql放在最前面顯示。另一個有用的參數就是sys,這個參數設置爲no能夠阻止全部以sys用戶執行的sql被顯示出來,這樣能夠減小分析出來的文件的複雜度,便於查看。
二. 對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這步。
三. Tkprof的使用步驟基本上遵循如下幾步:
1、設置TIMED_STATISTICS爲True,能夠在會話級別,也能夠在實例級別。
會話級:
SQL> alter session settimed_statistics=True;
實例級:
SQL> alter system settimed_statistics=True scope=both;
2、 設置SQL_TRACE,能夠在會話級,也能夠在數據庫級。
會話級:
SQL> alter session set sql_trace=true;
實例級:
SQL> alter system set sql_trace=truescope=both;