1 set autorace trace explain
2 explain plan for sql statements
select * from table(dbms_xplan.display);
3,跟蹤sql的方法 alter session set sql_trace = true;
sql statements
alter session set sql_trace = off;
根據腳本查找出當前會話的spid,去 $oracle_base/admin/sid/udump/ 下去查找
跟蹤其他會話 dbms_system.set_sql_trace_in_session(sid,serial#,true/false)來跟蹤
4 通過用 10046調試事件來實現
level 0
level 1
level 4 bind
level 8 wait events
level 12 1+4+8
alter session set events '10046 trace name context forever,level 8
sql statement
alter session set events '10046 trace name context off';
跟蹤其他會話:
sys:
exec dbms_system.set_ev(127,31923,10046,8,'A');
dbms_system.set_ev(sid,serial#,10046,8,'username');
sql statements
dbms_system.set_ev(sid,serial#,10046,0,'username');
5 :oralce 10g引入 dbms_monitors來基於客戶標示符,服務名,實例,模塊名 來跟蹤sql
1、直接使用sqlplus系統參數:
SQL> set autotrace on explain
SQL> select * from dual;
D
-
X
Execution Plan
----------------------------------------------------------
Plan hash value: 272002086
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0) | 00:00:01 |
| 1 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0) | 00:00:01 |
--------------------------------------------------------------------------
SQL> set autotrace off
但是這樣操作的結果是先執行SQL,再出執行計劃,如果SQL耗時巨大,則不現實;
2、使用explain plan for語句:
SQL> explain plan for select * from dual;
Explained.
SQL> select * from table(DBMS_XPLAN.display);
Execution Plan
----------------------------------------------------------
Plan hash value: 2137789089
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8168 | 16336 | 21 (0)| 00:00:01 |
| 1 | COLLECTION ITERATOR PICKLER FETCH| DISPLAY | | |
| |
---------------------------------------------------------------------------------------------
這樣就可以在執行SQL之前查看執行計劃了
3、啓用SQL_TRACE跟蹤所有後臺進程活動:
全局參數設置:
..OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
當前session中設置:
SQL> alter session set SQL_TRACE=true;
SQL> select * from dual;
SQL> alter session set SQL_TRACE=false;
對其他用戶進行跟蹤設置:
SQL> select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
129 48940 B
SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
SQL> select * from dual;
SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
然後使用oracle自帶的tkprof命令行工具格式化跟蹤文件。
4、使用10046事件進行查詢:
10046事件級別:
Lv1 - 啓用標準的SQL_TRACE功能,等價於SQL_TRACE
Lv4 - Level 1 + 綁定值(bind values)
Lv8 - Level 1 + 等待事件跟蹤
Lv12 - Level 1 + Level 4 + Level 8
全局設定:
..OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
當前session設定:
SQL> alter session set events '10046 trace name context forever, level 8';
SQL> select * from dual;
SQL> alter session set events '10046 trace name context off';
對其他用戶進行設置:
SQL> select sid,serial#,username from v$session where username='XXX';
SID SERIAL# USERNAME
------ ---------- ------------------
127 31923 A
128 54521 B
129 48940 B
SQL> exec dbms_system.set_ev(127,31923,10046,8,'A');
SQL> select * from dual;
SQL> exec dbms_system.set_ev(127,31923,10046,0,'A');
5、使用tkprof格式化跟蹤文件:
使用一下SQL找到當前session的跟蹤文件:
---- 當前 session
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 v$thread t,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;
---- 其他用戶 session
SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name
from
( select p.spid from v$session s, v$process p
where s.sid= '127' and s. SERIAL#= '31923' and p.addr = s.paddr) p,
( select t.instance from v$thread t,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命令:
SQL> $tkprof D:/....../SID_ora_5352.trc D:/....../SID_ora_5352.txt
注:無法使用autotrace的解決辦法(9i):
SQL>start $ORACLE_HOME/rdbms/admin/utlxplan.sql;
SQL>create public synonym plan_table for plan_table;
SQL>grant ALL on plan_table to public;