標籤:database oracle 效能 資料庫
tkprof是Oracle內建的一個命令列工具,主要作用是將原始的追蹤檔案轉換為格式化的文字檔,最簡單的使用方式如下:
tkprof ly_ora_128636.trc ly_ora_128636.txt
tkprof帶有很多參數,在多數情況下,使用這些參數對你的分析將很有協助。
tkprof參數
如果不帶任何參數運行tkprof,它將列印出完整的參數列表,並帶有簡單的描述。下面是對參數的說明:
explain
為每個SQL語句提供一個執行計畫。該參數需要指定使用者、密碼,也可以指定資料庫連接串,如:explain=user/[email protected]_string或者explain=user/password。
table
紙盒explain參數一起使用,用於指定產生執行計畫使用的表,通常不需要指定,只有當使用者不能建立表時才需要(如缺少create table許可權)。
print
用於限制輸出檔案產生的SQL語句的數量,例如:print=10.
aggregate
指定是否單獨處理同樣內容的SQL語句,預設不單獨處理。指定為aggregate=no,看單獨的每個SQL語句。
insert
產生SQL指令碼,SQL指令碼可以用來儲存資訊到資料庫中,SQL指令碼的名字由參數指定,如:insert=load.sql。
sys
指定sys使用者啟動並執行SQL語句是否也寫入到輸出檔案中,預設yes。
record
產生SQL指令碼,裡麵包含在trace檔案中找到的所有非遞迴語句,指令碼名通過參數本身來指定,例如:record=replay.sql。
waits
是否添加等待事件的資訊,預設添加。
sort
指定寫入輸出檔案中的SQL語句的順序。預設是trace檔案中發現的SQL順序。
下面是一個例子:
tkprof {input trace file} {output file} sys=no sort=prsela,exeela,fchela
prsela:第一個遊標解析耗費的時間
exeela:針對遊標執行花費的時間
fchela:遊標擷取資料行所花費的時間
tkprof輸出
輸出檔案帶有一個頭,其中有對參數的說明,如下:
**********************************************************************count = number of times OCI procedure was executedcpu = cpu time in seconds executing elapsed = elapsed time in seconds executingdisk = number of physical reads of buffers from diskquery = number of buffers gotten for consistent readcurrent = number of buffers gotten in current mode (usually for update)rows = number of rows processed by the fetch or execute call**********************************************************************
count:執行的資料庫調用次數
cpu:處理資料調用花去的CPU時間,以秒為單位
elapsed:處理資料庫調用花費的總的時間,以秒為單位
disk:物理讀的資料區塊數量,如果大於邏輯讀的數量(disk>query+current),表示使用了暫存資料表空間。
query:在一致性模式下從快取邏輯讀取的快數量,用作查詢。
current:在當前模式下從快取邏輯讀取的塊數量,用於insert、delete、merge以及update等操作。
rows:處理的資料行數量。查詢表示擷取的行數量,而insert、delete、merge以及update等則表示影響的行數量。
下面看一個具體的例子:
call count cpu elapsed disk query current rows------- ------ -------- ---------- ---------- ---------- ---------- ----------Parse 1 0.00 0.00 0 0 0 0Execute 1 0.00 0.00 0 0 0 0Fetch 501 0.03 0.15 0 1465 0 50001------- ------ -------- ---------- ---------- ---------- ---------- ----------total 503 0.03 0.15 0 1465 0 50001
上面分別對應了parse、execute和fetch這3個階段,在fetch階段執行了501次fetch,擷取了50001行資料,每次fetch擷取100行資料。
接下來是:
Misses in library cache during parse: 1Misses in library cache during execute: 1Optimizer mode: ALL_ROWSParsing user id: 5
前兩行表示發生在解析和執行調用階段的硬解析數量,如果沒有硬解析,則不存在。
“Optimizer mode”表示最佳化器模式。
“Parsing user id”是解析SQL語句的使用者。
在這之後可以看到執行計畫,這裡只做一個簡單講解:
Rows Row Source Operation------- --------------------------------------------------- 50001 COUNT STOPKEY (cr=1465 pr=0 pw=0 time=300125 us) 50001 VIEW (cr=1465 pr=0 pw=0 time=200088 us) 50001 INDEX FULL SCAN IDX_HISTORYALARM$CLEAR (cr=1465 pr=0 pw=0 time=100049 us)(object id 53743)
cr:一致性模式下邏輯讀出的資料區塊數
pr:從磁碟物理讀出的資料區塊數
pw:物理寫入磁碟的資料區塊數
time:以微妙表示的總的耗費時間,注意資料不精確
cost:操作的評估開銷(僅11g才提供)
size:操作返回的預估計資料量(位元組數)(僅11g才提供)
card:操作返回的預估計行數(僅11g才提供)
接下來就是等待事件:
Event waited on Times Waited Max. Wait Total Waited ---------------------------------------------------------------------------------- SQL*Net message to client 502 0.00 0.00 SQL*Net message from client 502 0.08 15.42 SQL*Net more data to client 500 0.00 0.01
Times Waited:等待時間佔用時間
Max. Wait:單個等待事件最大等待時間,單位為秒
Total Waited:針對一個等待事件總的等待秒數,不精確
這裡你可以看到執行中遇到的等待事件,通過對這些等待事件的分析,有助於你瞭解在等待什麼樣的資源,查詢的瓶頸,有針對的做出最佳化。可以在Oracle Database Reference手冊的附錄中找到關於多數常見等待事件的簡短描述。