SQL_TRACE

ewelamb發表於2012-11-07

;

VAR AA VARCHAR2(16);
BEGIN
:AA:='11111111';
END;
/
SELECT * FROM TABLE WHERE COL1=:AA;
COMMIT;


UDUMP
tkprof tracefile outputfile

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

Tkprof命令後面可以帶各種型別的排序選項,具體如下:
Usage: tkprof tracefile outputfile [explain= ] [table= ][print= ] [insert= ] [sys= ] [sort= ]

引數說明:
tracefile:要分析的trace檔案
outputfile:格式化後的檔案

table=schema.tablename
     注1:這兩個引數是一起使用的,透過連線資料庫對在trace檔案中出現的每條sql語句檢視執行計劃,並將之輸出到outputfile中
     注2:該table必須是資料庫中不存在的,如果存在會報錯
print=n:只列出最初N個sql執行語句
insert=filename:會產生一個sql檔案,執行此檔案可將收集到的資料insert到資料庫表中
sys=no:過濾掉由sys執行的語句
record=filename:可將非巢狀執行的sql語句過濾到指定的檔案中去
waits=yes|no:是否統計任何等待事件
aggregate=yes|no:是否將相同sql語句的執行資訊合計起來,預設為yes
sort= option:設定排序選項,選項如下:
    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 --要設定初始化引數time_statistics=true
    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
可根據自己的需要設定排序

舉例:
/*將生成的fgisdb_ora_1204_test.trc的跟蹤檔案轉化為cc檔案,條件:只列出前三個sql語句;生成insert.sql,執行該檔案將資料儲存至資料庫;
提取sql語句,sqlstr.sql預設在執行該命令的路徑;並且輸出執行計劃*/
C:\Documents and Settings\Administrator>tkprof D:\oracle\product\10.2.0\admin\fgisdb\udump\fgisdb_ora_1204_test.trc 
c:\cc.txt print=3 insert=c:\insert.sql record=sqlstr.sql  table=gwm.trace_test 
sort=(prsela, exeela, fchela)
--sort選項可同時用多個,做法是用括號括起來,中間用逗號分割:
注意:最後排序是按照各個選項的數字之和進行排序,類似於order by (sort1+sort2+sort3),而不是order by sort1,sort2,sort3

分析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這步。
 
A、query+current/rows 平均每行所需的block數,太大的話(超過20)SQL語句效率太低


B、Parse count/Execute count parse count應儘量接近1,如果太高的話,SQL會進行不必要的reparse


C、rows Fetch/Fetch Fetch Array的大小,太小的話就沒有充分利用批次Fetch的功能,增加了資料在客戶端和伺服器之間的往返次數。


D、disk/query+current 磁碟IO所佔邏輯IO的比例,太大的話有可能是db_buffer_size過小(也跟SQL的具體特性有關)


E、elapsed/cpu 太大表示執行過程中花費了大量的時間等待某種資源


F、cpu Or elapsed 太大表示執行時間過長,或消耗了了大量的CPU時間,應該考慮最佳化


G、執行計劃中的Rows 表示在該處理階段所訪問的行數,要儘量減少

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

相關文章