oracle10g 檢視SQL執行計劃

guyuanli發表於2009-06-30

oracle10g檢視SQL執行計劃有很多方法:

1.透過PL/SQL開啟SQLWINDOW按F5可以看到執行計劃,但是這裡沒有物理讀等統計資訊

[@more@]

2.使用dbms_xplan包,這裡跟F5差不多,也是沒有一些統計資訊

Oracle9i新引入的包dbms_xplan
Oracle9i新引入的包dbms_xplan。函式display有三個引數:Table_name——執行計劃所存放的表,預設為PLAN_TABLE;STATEMENT_ID——PLAN_TABLE表中的欄位;FORMAT——顯示格式。
SQL> explain plan for
2 select
3 tA.n2,
4 tB.n2
5 from
6 t1 tA,
7 t1 tB
8 where
9 tA.n1 = 15
10 and tB.n1 = tA.n1 11 ;

Explained. SQL> select * from table(dbms_xplan.display);

優點:適合於bind var的SQL。可以直接執行,能夠根據相關資訊排序,顯示介面友好。

3.使用autotrace檢視,可以檢視一些統計資訊

首先執行指令碼
SQL>@D:oracleora92rdbmsadminutlxplan.sql 建立plan_table表
SQL> set autotrace on
SQL> set autotrace traceonly
SQL> select table_name from user_tables;

關於Autotrace幾個常用選項的說明:
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 報告,這是預設模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只顯示最佳化器執行路徑報告
SET AUTOTRACE ON STATISTICS -- 只顯示執行統計資訊
SET AUTOTRACE ON ----------------- 包含執行計劃和統計資訊
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不顯示查詢輸出


已選擇98行。
已用時間: 00: 00: 00.04
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 NESTED LOOPS (OUTER)
3 2 NESTED LOOPS (OUTER)
4 3 NESTED LOOPS (OUTER)
5 4 NESTED LOOPS (OUTER)
6 5 NESTED LOOPS
7 6 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
8 7 INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
9 6 TABLE ACCESS (CLUSTER) OF 'TAB$'
10 9 INDEX (UNIQUE SCAN) OF 'I_OBJ#' (NON-UNIQUE)
11 5 TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
12 11 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
13 4 INDEX (UNIQUE SCAN) OF 'I_OBJ1' (UNIQUE)
14 3 TABLE ACCESS (CLUSTER) OF 'USER$'
15 14 INDEX (UNIQUE SCAN) OF 'I_USER#' (NON-UNIQUE)
16 2 TABLE ACCESS (CLUSTER) OF 'SEG$'
17 16 INDEX (UNIQUE SCAN) OF 'I_FILE#_BLOCK#' (NON-UNIQUE)
18 1 TABLE ACCESS (CLUSTER) OF 'TS$'
19 18 INDEX (UNIQUE SCAN) OF 'I_TS#' (NON-UNIQUE)

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1389 consistent gets
0 physical reads
0 redo size
2528 bytes sent via SQL*Net to client
569 bytes received via SQL*Net from client
8 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
98 rows processed
SQL>
4.使用sql_trace檢視,這個跟3差不多

在pl/sql或者sqlplus中,開啟一個sql_window。
(1)先執行:alter session set sql_trace=true;
(2)再執行你那個返回結果不正確的SQL
(3)再執行:alter session set sql_trace=false;
(4)馬上登陸到機器上,到$ORACLE_BASE/admin/sid/udump目錄下。找到剛生成的.trc檔案(假設檔名是1234455.trc)。執行命令:tkprof 1234455.trc aa.txt。檢視aa.txt檔案。這個檔案裡面有執行計劃。看看執行計劃每一步返回的結果集記錄數是不是正確。

5.透過10053事件來檢視,這裡面可以查到一些關於SQL成本的詳細資訊

在pl/sql或者sqlplus中,開啟一個sql_window。
(1)先執行:Alter session set events’10053 trace name context forever[,level {1/2}]’;

(2)再執行你那個返回結果不正確的SQL
(3)再執行:Alter session set events’10053 trace name context off’;

(4)馬上登陸到10.1.4.10機器上,到$ORACLE_BASE/admin/sid/udump目錄下。找到剛生成的.trc檔案)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7490392/viewspace-1023626/,如需轉載,請註明出處,否則將追究法律責任。

相關文章