--========================
-- Sql Trace
--========================
一、用戶進程跟蹤文件
用戶跟蹤文件在根據需要跟蹤會話實際操作的時候根據要求產生
通常用於幫助調整應用程序,比如檢查由SQL的不良寫法所致的相關問題等等
由用戶進程發出,服務器進程產生該類文件
包含跟蹤SQL命令的統計信息、包含用戶的錯誤信息
缺省情況下當用戶出現會話錯誤時產生
位置由user_dump_dest設定
文件大小由max_dump_file_size 決定
可以設定記錄會話的所有信息
分爲基於會話級別和基於實例級別,大多數情況下,在session級別進行跟蹤
二、不同級別的跟蹤
instance level:
alter system set sql_trace = true;
session level:
使用alter session命令啓用跟蹤
alter session set sql_trace = true;
使用dbms包來啓用跟蹤
dbms_system.SET_SQL_TRACE_IN_SESSION
三:
10053 trace跟蹤文件
可以通過alter session set event 來創建,但是前提是這條SQL被真正執行過。
常見創建方法:
alter session set tracefile_identifier='mytrace';
alter session set events '10053 trace name context forever';
select * from emp where ename='scott';
alter session set events '10053 trace name context off';
到了11g 對於10053有了優化,所以以上創建方法還可以是:
alter session set tracefile_identifier='mytrace'; 創建trace標識符
alter session set events 'trace [sql_compiler.*]';
select * from emp where name='scott';
alter session set events 'trace [sql_compiler.*] off'; 退出10053 trace.
但是有的場景是不允許你執行sql的,比如sql是修改數據的,或者sql很大對性能有影響,或者沒有執行權限。這個時候我們可以使用dbms_sqldiag.dump_trace來實現,具體方法如下:
begin
dbms_sqldoag.dump_trace(p_sql_id=>'',
p_child_number=>0,
p_component=>'compiler',
p_file_id=>'mytrace');
end;
/
但是注意的是每次執行 dbms_sqldoag.dump_trace都會觸發一此硬解析,因此不能再繁忙期或者頻繁的執行。
方法1:10046事件
可以明確顯示目標SQL的實際執行中每一個執行步驟所消耗的邏輯度,物理度和花費時間
激活10046事件:
alter session set events '10046 trace name content forever,level 12'
或
oradebug event 10046 trace name context forevel,level 12
在此session中執行sql
得到trace 文件路徑
oradebug tracefile_name
關閉10046事件
alter session set events ' 10046 trace name context off'
或
oradebug event 10046 trace name context off