sql_trace的介绍
sql_trace的介紹
--打開trace文件設(shè)置,把sql trace設(shè)置為true,就會在udump目錄中增加一個trc文件。
alter session set sql_trace=true;
show parameter sql_trace;(select * from v$parameter where name='sql_trace';)
修改后不生效呢?show parameter sql_trace;其參數(shù)始終是FALSE
??? show parameter sql_trace是從v$parameter中取相應(yīng)參數(shù),而v$parameter是體現(xiàn)了全部的init.ora的內(nèi)容。而show user應(yīng)該是取的當前會話的參數(shù)。
sql_trace 是可以在系統(tǒng)或會話級上啟用,并且產(chǎn)生很多輸出,系統(tǒng)級應(yīng)該是直接改init了,會話級就用alter session set sql_trace = true來生效。ISSES_MODIFIABLE=false應(yīng)該是說明在會話一級上,不能啟用系統(tǒng)一級的跟蹤
??? 如果修改系統(tǒng)的參數(shù),用如下語句:
alter system set sql_trace=true;
??? 此時在查看show parameter sql_trace;可看到sql_trace的value值為TRUE
--對跟蹤文件做標記
alter session set tracefile_identifier='look_for_me'; --
在D:\oracle\product\10.2.0\admin\fgisdb\udump路徑下可以找到標記為look_for_me的跟蹤文件
--停止該會話的跟蹤
alter session set sql_trace=false;
?
?
--查看跟蹤文件名
select d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
?????? p.spid || '.trc' trace_file_name
? from (select p.spid
????????? from v$mystat m, v$session s, v$process p
???????? where m.statistic# = 1
?????????? and s.sid = m.sid
?????????? and p.addr = s.paddr) p,
?????? (select t.instance
????????? from sys.v$thread t, sys.v$parameter v
???????? where v.name = 'thread'
?????????? and (v.value = 0 or t.thread# = to_number(v.value))) i,
?????? (select value from v$parameter where name = 'user_dump_dest') d
?
?
TKPROF的介紹
?
??? Tkprof是一個用于分析Oracle跟蹤文件并且產(chǎn)生一個更加清晰合理的輸出結(jié)果的可執(zhí)行工具。如果一個系統(tǒng)的執(zhí)行效率比較低,
一個比較好的方法是通過跟蹤用戶的會話并且使用Tkprof工具使用排序功能格式化輸出,從而找出有問題的SQL語句。
Tkprof命令后面可以帶各種類型的排序選項,具體如下:
Usage: tkprof tracefile outputfile [explain= ] [table= ][print= ] [insert= ] [sys= ] [sort= ]
參數(shù)說明:
tracefile:要分析的trace文件
outputfile:格式化后的文件
explain=user/password@connectstring
table=schema.tablename
???? 注1:這兩個參數(shù)是一起使用的,通過連接數(shù)據(jù)庫對在trace文件中出現(xiàn)的每條sql語句查看執(zhí)行計劃,并將之輸出到outputfile中
???? 注2:該table必須是數(shù)據(jù)庫中不存在的,如果存在會報錯
print=n:只列出最初N個sql執(zhí)行語句
insert=filename:會產(chǎn)生一個sql文件,運行此文件可將收集到的數(shù)據(jù)insert到數(shù)據(jù)庫表中
sys=no:過濾掉由sys執(zhí)行的語句
record=filename:可將非嵌套執(zhí)行的sql語句過濾到指定的文件中去
waits=yes|no:是否統(tǒng)計任何等待事件
aggregate=yes|no:是否將相同sql語句的執(zhí)行信息合計起來,默認為yes
sort= option:設(shè)置排序選項,選項如下:
??? 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 --要設(shè)置初始化參數(shù)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
可根據(jù)自己的需要設(shè)置排序
舉例:
/*將生成的fgisdb_ora_1204_test.trc的跟蹤文件轉(zhuǎn)化為cc文件,條件:只列出前三個sql語句;生成insert.sql,運行該文件將數(shù)據(jù)保存至數(shù)據(jù)庫;
提取sql語句,sqlstr.sql默認在執(zhí)行該命令的路徑;并且輸出執(zhí)行計劃*/
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 explain=gwm/gwm@fgisdb table=gwm.trace_test
sort=(prsela, exeela, fchela)
--sort選項可同時用多個,做法是用括號括起來,中間用逗號分割:
注意:最后排序是按照各個選項的數(shù)字之和進行排序,類似于order by (sort1+sort2+sort3),而不是order by sort1,sort2,sort3
分析tkprof文件:
CALL :每次SQL語句的處理都分成以下三個部分
???????? Parse:這步將SQL語句轉(zhuǎn)換成執(zhí)行計劃,包括檢查是否有正確的授權(quán)和所需要用到的表、列以及其他引用到的對象是否存在。
???????? Execute:這步是真正的由Oracle來執(zhí)行語句。對于insert、update、delete操作,這步會修改數(shù)據(jù),對于select操作,這步就只是確定選擇的記錄。
???????? Fetch:返回查詢語句中所獲得的記錄,這步只有select語句會被執(zhí)行。
COUNT:這個語句被parse、execute、fetch的次數(shù)。
CPU:這個語句對于所有的parse、execute、fetch所消耗的cpu的時間,以秒為單位。
ELAPSED:這個語句所有消耗在parse、execute、fetch的總的時間。
DISK:從磁盤上的數(shù)據(jù)文件中物理讀取的塊的數(shù)量。一般來說更想知道的是正在從緩存中讀取的數(shù)據(jù)而不是從磁盤上讀取的數(shù)據(jù)。
QUERY:在一致性讀模式下,所有parse、execute、fetch所獲得的buffer的數(shù)量。一致性模式的buffer是用于給一個長時間運行的事務(wù)提供一個一致性讀的快照,?
??????????? 緩存實際上在頭部存儲了狀態(tài)。
CURRENT:在current模式下所獲得的buffer的數(shù)量。一般在current模式下執(zhí)行insert、update、delete操作都會獲取 buffer。在current模式下如果在高速緩存
??????????????? 區(qū)發(fā)現(xiàn)有新的緩存足夠給當前的事務(wù)使用,則這些buffer都會被讀入了緩存區(qū)中。
ROWS: 所有SQL語句返回的記錄數(shù)目,但是不包括子查詢中返回的記錄數(shù)目。對于select語句,返回記錄是在fetch這步,對于insert、update、delete操作,返回
?????????? 記錄則是在execute這步。
?
A、query+current/rows 平均每行所需的block數(shù),太大的話(超過20)SQL語句效率太低
B、Parse count/Execute count parse count應(yīng)盡量接近1,如果太高的話,SQL會進行不必要的reparse
C、rows Fetch/Fetch Fetch Array的大小,太小的話就沒有充分利用批量Fetch的功能,增加了數(shù)據(jù)在客戶端和服務(wù)器之間的往返次數(shù)。
D、disk/query+current 磁盤IO所占邏輯IO的比例,太大的話有可能是db_buffer_size過小(也跟SQL的具體特性有關(guān))
E、elapsed/cpu 太大表示執(zhí)行過程中花費了大量的時間等待某種資源
F、cpu Or elapsed 太大表示執(zhí)行時間過長,或消耗了了大量的CPU時間,應(yīng)該考慮優(yōu)化
G、執(zhí)行計劃中的Rows 表示在該處理階段所訪問的行數(shù),要盡量減少
?
http://www.cnblogs.com/lanzi/archive/2011/01/14/1935558.html
轉(zhuǎn)載于:https://www.cnblogs.com/chinhr/archive/2011/11/09/2243306.html
總結(jié)
以上是生活随笔為你收集整理的sql_trace的介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯联姻开心网意欲何为
- 下一篇: “才分山水形”下一句是什么