TKPROF使用學習

Tkprof工具可用來格式化sql trace產生的文件,讓你更容易看懂trace的內容
用法
tkprof tracefile outputfile [explain= ] [table= ] [print= ] [insert= ] [sys= ] [sort= ] ...
參數說明
tracefile:你要分析的trace文件
outputfile:格式化後的文件
explain=user/password@connectstring
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
    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
可根據自己的需要設置排序
舉例
1.列出前2條sql語句的執行情況:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt print=2
2.將數據保存到數據庫:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt insert=c:\insert.sql
執行後會在c:\產生insert.sql文件,執行該文件即可將數據保存到數據庫,以下爲insert.sql部分內容:
REM Edit and/or remove the following CREATE TABLE
REM statement as your needs dictate.
CREATE TABLE tkprof_table
(
date_of_insert DATE
,cursor_num NUMBER
,depth NUMBER
,user_id NUMBER
,parse_cnt NUMBER
,parse_cpu NUMBER
,parse_elap NUMBER
,parse_disk NUMBER
,parse_query NUMBER
,parse_current NUMBER
,parse_miss NUMBER
,exe_count NUMBER
,exe_cpu NUMBER
,exe_elap NUMBER
,exe_disk NUMBER
,exe_query NUMBER
,exe_current NUMBER
,exe_miss NUMBER
,exe_rows NUMBER
,fetch_count NUMBER
,fetch_cpu NUMBER
,fetch_elap NUMBER
,fetch_disk NUMBER
,fetch_query NUMBER
,fetch_current NUMBER
,fetch_rows NUMBER
,ticks NUMBER
,sql_statement LONG
);
INSERT INTO tkprof_table VALUES
(
SYSDATE, 1, 0, 61, 1, 0, 418, 0, 0, 0, 1
, 1, 15625, 1435, 0, 0, 0, 0, 0
, 4, 0, 4417, 0, 24, 0, 36, 13450151
, ’select * from tblinventoryhistory
‘);
3.提取sql執行語句:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt record=sqlstr.sql
sqlstr.sql中的內容:
alter session set sql_trace=true ;
alter session set events '10046 trace name context forever,level 12';
select * from tblinventoryhistory ;
select * from tblorder ;
select * from tblproduct ;
select * from tbluser ;
select * from tblroute ;
4.產生執行計劃:
C:\>tkprof c:\oc_ora_2892.trc c:\ff.txt explain=ocuser/ocuser table=ocuser.test1
在產生的ff.txt文件中會體現其執行計劃:
Rows Execution Plan
——- —————————————————
0 SELECT STATEMENT GOAL: CHOOSE
0 TABLE ACCESS (FULL) OF 'TBLROUTE'
小技巧
1.如何查找你產生的trace文件:
可用eygle寫的腳本去查找:
SQL> select d.value || '\' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
  2         p.spid || '.trc' trace_file_name
  3    from (select p.spid
  4            from sys.v$mystat m, sys.v$session s, sys.v$process p
  5           where m.statistic# = 1
  6             and s.sid = m.sid
  7             and p.addr = s.paddr) p,
  8         (select t.instance
  9            from sys.v$thread t, sys.v$parameter v
10           where v.name = 'thread'
11             and (v.value = 0 or t.thread# = to_number(v.value))) i,
12         (select value from sys.v$parameter where name = 'user_dump_dest') d;
TRACE_FILE_NAME
——————————————————————————–
/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc
2.sort選項可同時用多個,做法是用括號括起來,中間用逗號分割:
C:\>tkprof c:\oc_ora_2892.trc c:\cc.txt sort=(prsela, exeela, fchela)
注意:最後排序是按照各個選項的數字之和進行排序,類似於order by (sort1+sort2+sort3),而不是order by sort1,sort2,sort3

oracle性能優化:如何讀懂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 表示在該處理階段所訪問的行數,要儘量減少
EG:
alter session set max_dump_file_size=unlimited;
alter session set timed_statistics=true;
alter session set events '10046 trace name context forever, level 12';
select 'Hello, world; today is '||sysdate from dual; exit;
tkprof card_ora_13226.trc trace.txt print=100 record=sql.txt sys=no
然後查詢trace.txt就是分析內容了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章