共計 3409 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章主要介紹 oracle 中 10046 事件怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
10046 的 定義
sql_trace/10046 事件是 oracle 提供的用于進行 sql 跟蹤的手段,其內容包括 sql 的解析過程、sql 的執行計劃、綁定變量的使用、會話發生的等待事件。
10046 生成語句方法:
SQL alter session set events 10046 trace name
context forever,level 12
現在隨便查詢一個什么,如:
select * from
dba_users where rownum 20
查看 trace 文件
SQL
select * from v$diag_info;
里面有個 Default Trace File
1 Default Trace File
/u01/app/oracle/diag/rdbms/prod1/PROD1/trace/PROD1_ora_28613.trc
10g 的話,show parameter dump; 找 udump
10046 級別
目的:獲取 sql、pl_sql 等相關語句的執行情況解析
10046 級別:共 4 個級別 分別為 0、1、4、8、12
10046 事件是 SQL_TRACE 的擴展,被戲稱為 吃了興奮劑的 SQL_TRACE
有效的追蹤級別:
① 0 級:SQL_TRACE=FASLE
② 1 級:SQL_TRACE=TRUE,這是缺省級別
③ 4 級:1 級 + 綁定變量
④ 8 級:4 級 + 等待事件
⑤ 12 級:4 級 + 8 級
tkprof:oracle 內置的針對跟蹤文件格式化的一種工具
alter session set
events 10046 trace name context forever, level 12 – 當前會話啟用跟蹤
alter session set
events 10046 trace name context off
– 關閉當前會話跟蹤
select sid,serial#,username from v$session where username is not
null; – 查詢 sid 和 serial
execute
dbms_system.set_ev(sid,serial#,10046,12,
– 在當前會話對其它會話進行跟蹤
execute
dbms_system.set_ev(sid,serial#,10046,0,
– 在當前會話關閉其它會話跟蹤
tkprof 常用參數
tkprof 回車查看一下幫助
就知道怎么用了 tkprof 解析源追蹤文件 解析完成的文件
filename 由 SQL trace 產生的輸入跟蹤文件
explain SQL 語句的 explain plain
recoed 創建非遞歸 SQL 語句的 SQL 腳本
waits 記錄等待事件的匯總
SORT 根據一個或多個項目提供分類數據,如 PRSCPU(CPU 時間分析)、PRSELA(已用時間分析)等
table 定義表的名稱,TKPROF 實用程序暫時將執行計劃放入該表中
sys 啟用或禁用由 sys 給出的一組 SQL 語句
PRINT 僅列出指定數量的 SQL 語句,而不是所有的 SQL 語句
insert 創建存儲跟蹤數據庫信息的腳本
與 10046 相關的兩個參數:
show
parameter max_dump_file_size;
對 trace 文件的大小限制
show
parameter timed_statistics;
對重要信息的收集是否開啟
10046 怎么看?
tkprof 文件都包含以下內容:
sql 語句
分析 執行 獲取調用的次數
被處理的行數
所使用 CPU 的秒數
所使用的 IO
庫高速緩存未命中
可選的執行計劃
行源 操作列表
一個報告,總結分析了在跟蹤文件中有多少相似和完全不同的語句,如果同樣的語句,parse 列總是一個大值,說明沒有用上綁定變量
count =
number of times OCI procedure was executed。OCI 為 oracle 的調用接口,提供了一組可對 ORACLE 數據庫進行存取的接口子例程(函數),通過在第三代程序設計語言(如 C 語言)中進行調用可達到存取 ORACLE 數據庫的目的。
cpu =
cpu time in seconds executing 以秒為單位的
elapsed = elapsed
time in seconds executing 以秒為單位的消耗時間
disk =
number of physical reads of buffers from disk 物理讀
query =
number of buffers gotten for consistent read 為了一致性讀獲得的空間。
在一致性讀模式下,所有 parse、execute、fetch 所獲得的 buffer 的數量。一致性模式的 buffer 是用于給一個長時間運行的事務提供一個一致性讀的快照,緩存實際上在頭部存儲了狀態。
current = number of
buffers gotten in current mode (usually for update) 數據庫塊命中的次數,通常是為了 update
在 current 模式下所獲得的 buffer 的數量。一般在 current 模式下執行 insert、update、delete 操作都會獲取 buffer。
rows =
number of rows processed by the fetch or execute call 每一種調用類型所處理的行的總數
還有這些:
Misses in library cache during parse:發生在解析的硬解析數量,如果是軟解析則 Misses in library cache during parse 將為 0
Misses in library cache during execute:發生在執行調用階段的硬解析數量。如果在執行調用時沒有硬解析發生,Misses in library cache during execute 這一行將不存在。
重點參考:http://czmmiao.iteye.com/blog/1493765
分析下面一段代碼:
SQL ID: 00fqk94bdzqnj Plan Hash:
644658511
select sid,serial#,username
from
v$session where username is not null
call count①
cpu elapsed disk
query current rows
——- —— ——– ———- ———- ———-
———- ———-
Parse 1
0.01 0.01 0 0 0 0
Execute 1
0.00 0.00 0 0 0 0
Fetch 2
0.00 0.00 0 0 0 2
——- —— ——– ———- ———- ———-
———- ———-
total 4
0.01 0.01 0② 0 0 2
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Number of plan statistics captured: 1
①假設 count 這列,fetch 部分執行了 17324 次,獲得的 rows 行數是 259806,兩者相除,就可以得出一次獲取,能夠獲取多少行記錄,一次獲得 15 行數據,懷疑是用了數組取操作。
②理論上,elapsed time=CPU time+disk time,即如果 elapsed time 為 1.85,CPU 為 1.82,那么 disk 可能就是 3。但是也可能是有等待事件,把大量時間花在了等待事件上。
③可以通過磁盤 IO 所占邏輯 IO 的比例,disk/query+current 來判斷磁盤 IO 的情況,太大的話有可能是 db_buffer_size 過小,當然這也跟 SQL 的具體特性有關
④query+current/rows
平均每行所需的 block 數,太大的話(超過 20)SQL 語句效率太低,數據過于分散,可以考慮重組對象
⑤通過 SQL ID:
06nvwn223659v Plan Hash: 0 標識出一個新的 SQL 分析,會發現很多是系統自己的 SQL,直接不用看
以上是“oracle 中 10046 事件怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!