您好,登錄后才能下訂單哦!
SQL_TRACE主要是為了追蹤SQL的執行過程,分析SQL的性能,資源消耗情況。
它可以查看SQL是如何操作處理數據、在執行過程中產生了哪些等待事件,查看sql在執行過程中的資源消耗、可以查看sql的遞歸語句,是sql的實際執行計劃。
(1)開啟跟蹤
跟蹤自己的會話很簡單
SQL>alter session set tracefile_identifier='mysession'; ---給當前會話一個標示,便于查找跟蹤生成的文件
Alter session set sql_trace= true;
或者
exec dbms_session.set_sql_trace(true);
如果跟蹤別人的會話,需要調用一個包
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false);
整個數據庫系統跟蹤
alter system set sql_trace=true; ---在11g中已經不推薦使用
(2)執行sql語句
SQl >select * from SCOTT.DEPT; --當前會話執行的語句
或者如果跟蹤別人的會話則等待別的會話執行sql語句
(3)關閉跟蹤
關閉跟蹤自己的會話
Alter session set sql_trace= false;
或者
exec dbms_session.set_sql_trace(false);
如果跟蹤別人的會話,需要調用一個包
exec dbms_system.set_sql_trace_in_session(sid,serial#,false);
關閉整個數據庫系統跟蹤
alter system set sql_trace= false; ---在11g中已經不推薦使用
(4)查找跟蹤文件
在$ORACLE_BASE/admin/sid/udump下找到跟蹤文件,比如前面設置標示符為'mysession'的trace文件
或者用腳本查看跟蹤文件位置(當前會話):
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 wherem.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;
(5)格式化跟蹤文件
tkprof 跟蹤文件名 輸出文件名
(6)案例1(當前會話跟蹤)
【示例】:
SQL> alter session set tracefile_identifier='mysession';
會話已更改。
SQL> Alter session set sql_trace= true;
會話已更改。
SQL> select * from SCOTT.DEPT;
DEPTNO DNAME LOC ---------- ---------------------------- -------------------------- 50 ACCOUNTINGcs NEW YORK 60 RESEARCHcs DALLAS 70 SALEScs CHICAGO 80 OPERATIONScs BOSTON 51 ACCOUNTINGcscs NEW YORK 61 RESEARCHcscs DALLAS 71 SALEScscs CHICAGO 81 OPERATIONScscs BOSTON 11 ACCOUNTINGcs NEW YORK 21 RESEARCHcs DALLAS 31 SALEScs CHICAGO
DEPTNO DNAME LOC ---------- ---------------------------- -------------------------- 41 OPERATIONScs BOSTON 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
已選擇16行。
SQL> Alter session set sql_trace= false;
會話已更改。 SQL> select d.value||'\'||lower(rtrim(i.instance,chr(0)))||'_ora_'||p.spid||'.tr c' trace_file_name from(select p.spid from v$mystat m, v$session s,v$process p w here m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr ) p, (select t.inst ance 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 = 'u ser_dump_dest') d;
TRACE_FILE_NAME --------------------------------------------------------------------------------
e:\app\yan\diag\rdbms\orcl\orcl\trace\orcl_ora_1584.trc
進入命令行: C:\Users\yan>e:
E:\>cd E:\app\yan\diag\rdbms\orcl\orcl\trace
由于剛才用了標示符,所以跟蹤文件多了mysessio字符串: E:\app\yan\diag\rdbms\orcl\orcl\trace>tkprof orcl_ora_1584_mysession.trc orcl_or a_1584_mysession.txt
TKPROF: Release 11.2.0.1.0 - Development on 星期三 3月 26 15:47:50 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. |
案例2(跟蹤別人的會話)
【示例】:
當前會話執行: SQL> select distinct sid from v$mystat;
SID ---------- 134 另一個會話執行: SQL> select distinct sid from v$mystat;
SID ---------- 141
當前會話執行: SQL> select sid,serial# from v$session where sid in (141,134);
SID SERIAL# ---------- ---------- 134 7471 141 14317
SQL> execute sys.dbms_system.set_sql_trace_in_session(141,14317,true);
PL/SQL 過程已成功完成。
另一個會話執行:
SQL> select count(*) from SCOTT.t1;
COUNT(*) ---------- 72564
當前會話執行: SQL> execute sys.dbms_system.set_sql_trace_in_session(141,14317,false);
PL/SQL 過程已成功完成。
進入命令行: C:\Users\yan>e:
E:\>cd E:\app\yan\diag\rdbms\orcl\orcl\trace
由于剛才用了標示符,所以跟蹤文件多了mysessio字符串: E:\app\yan\diag\rdbms\orcl\orcl\trace>tkprof orcl_ora_12224.trc orcl_or a_12224.txt
TKPROF: Release 11.2.0.1.0 - Development on 星期三 3月 26 15:47:50 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
|
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。