跟蹤客戶端執行的SQL

leon830216發表於2014-03-01
-- 識別要跟蹤的客戶端程式到資料庫的資料庫連線
-- 只有DEDICATED模式下,跟蹤才有效
column machine format a30
column program for a40
column username format a15
select
    s.sid,
    s.serial#,
    s.username,
    /*s.machine,
    s.program,
    p.spid,
    s.server,*/
    to_char(s.logon_time,'yyyy-mm-dd hh24:mi:ss') logon_time
from
    v$session s,
    v$process p
where
    p.addr=s.paddr and
    s.username is not null
/

-- 設定相應的引數
-- 一下引數最好在session級別啟用,否則效能影響太大
-- 只有跟蹤的session再次發出sql語句後,才會產生trc檔案

-- timed_statistics
-- 收集跟蹤資訊時,是否將收集時間資訊,如果收集,則可以知道一個sql的各個執行階段耗費的時間情況
alter session set timed_statistics=true;

-- user_dump_dest
-- 存放跟蹤資料的檔案的位置
-- 只能在system級別作修改,所以一般用預設路徑
show parameter user_dump_dest

-- max_dump_file_size
-- 放跟蹤資料的檔案的最大值,防止由於無意的疏忽,使跟蹤資料的檔案佔用整個硬碟,影響系統的正常執行
alter session set max_dump_file_size=2048000000;

-- 啟動跟蹤功能
alter session set sql_trace = true;

-- 設定其他session
begin
exec dbms_system.set_int_param_in_session(sid,serial#,'max_dump_file_size',2048000000);
exec dbms_system.set_bool_param_in_session(sid,serial#,'timed_statistics',true);
exec dbms_system.set_sql_trace_in_session(sid,serial#,true);
end;
/

-- 讓系統執行一段時間,收集被跟蹤session中正在執行的sql效能資料
select * from emp;

-- 關閉跟蹤功能
alter session set sql_trace = false;

-- 格式化跟蹤資料
tkprof /udump/xe_ora_4687.trc out.log

-- 直接輸入tkprof,顯示幫助資訊
-- 計算sql消耗資源時,也要將recursive calls考慮進去

-- tkprof引數介紹
-- tracefile --- 指定輸入檔案,即oracle產生的trace檔案,該檔案中可以只包含一個session的跟蹤資訊,也可以包含系統中所有session的資訊(此時需要在系統級進行跟蹤)
-- outputfile --- 指定輸出檔案
-- explain --- explain=go/go,利用哪個使用者對trace檔案中的sql進行分析,從而得到該sql語句的執行計劃,這也說明在tracefile中並沒有各個sql語句的執行計劃,只是在執行tkprof程式時才將tracefile檔案中的sql語句用explian引數指定的使用者連線到資料庫,然後運用EXPLAIN PLAN命令生成sql的執行計劃,這個使用者一般是你的程式中連線資料庫的使用者
-- table --- 在對sql語句進行分析時,將產生的執行計劃暫時存放到該表中。一般不需要該引數,這樣當表不存在時,tkprof會自動建立相應的表,並在分析完之後,將建立的表自動刪除。如果要指定自定義的表,該表的結構必須與utlxplan.sql檔案中指定的表的結構一樣。我一般不設定這個引數,讓其採用預設的表名,並自動建立、刪除
-- sys --- 是否對sys使用者執行的sql語句或被跟蹤session產生的recursive SQL也進行分析,並將分析結果放到輸出檔案中。預設值為YES。我一般設為NO,這樣輸出檔案中只包含我發出的sql語句,而不包含系統產生的sql。
-- sort --- 按照指定的排序選項(條件)對格式化好的sql語句進行降序排列,然後存放到輸出檔案中。可以將多個排序選項組合起來,如果沒有指定排序選項,則按照使用sql的先後順序。
-- print --- 只列出指定數量的已排序的sql語句,排序的條件參見SORT引數。如果忽略此引數,tkprof將跟蹤檔案中的所有的sql語句及其相關的分析資料存放到輸出檔案中。print與sort引數組合在一起,可以實現,找出某一階段耗費cpu最多的前n個sql,找出某一階段讀硬碟最多的前n個sql等等。
-- insert --- 建立一個sql指令碼檔案,裡面包含create table 與insert語句。利用這個指令碼檔案建立一個表及插入資料後,可以得到跟蹤檔案中所有sql語句(包含recursive SQL)的統計資訊。利用這些資訊,也可以發現有問題的sql。即是格式化好的輸出檔案中有關sql效能資訊資料的資料庫表的形式。我一般不用該引數
-- record --- 建立一個包含客戶端程式發出的所有的sql語句的指令碼檔案。注意,並不包含recursive SQL。可以窺探別人程式是如何訪問資料庫的,從而對了解程式的訪問流程。此時,最好不用sort引數,這樣就可以按先後發出的順序的到sql
-- aggregate --- 把同一sql的資料綜合統計起來,只輸出一此統計資訊,預設為yes,指定為no時,每條sql會輸出多次統計資訊
-- waits --- 輸出任何等待事件的統計資訊,預設為yes

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

相關文章