【摘要】
執行計劃顯示在執行一條SQL語句時需要遵循的詳細步驟,這些步驟表示爲一組數據庫運算符,這些運算符將使用和生成行;運算符及其實施順序由優化器使用查詢轉換及物理優化技術的組合來確定。
執行計劃通常以表格的形式顯示,但它實際上爲樹形。
【正文】
如何獲得正確的執行計劃
獲取執行計劃有多種方式,但大部分不能得到正確的實際的執行計劃,因爲SQL語句必須過以後才能得到正確的執行計劃,下面展示獲得執行計劃的方式。
Explain plan 命令
Explain plan for SQL語句結合
Select * from table(dbms_xplan.display); --不能獲得正確的執行計劃
實例:
Explain plan for select * from dba_tables;
Select * from table(dbms_xplan.display);
DBMS_XPLAN包
Select * from table(dbms_xplan.display); --參考a)
Select * from table(dbms_xplan.display_cursor(null,null,’advanced’));
--執行完一條語句後,緊接着執行當條語句,就能得到真實的執行計劃
Select * from table(dbms_xplan.display_cursor(‘sql_id/hash_value’,child_cursor_number,’advanced’));
--通過v$sql視圖可以得到sql_id/hash_value和child_cursor_number(對應v$sql視圖中的child_number),此語句可得到真實的執行計劃
Select * from table(dbms_xplan.display_awr(‘sql_id’));
--從AWR中拿到真實的執行計劃
示例:
Set linesize 500
set termout off
1、alter session set statistics_level = all;
2、執行SQL語句
3、查看執行計劃
select * from table(dbms_xplan.display_cursor(null,null,'ADVANCED ALLSTATS LAST PEEKED_BINDS'));
SQLPLUS的AUTOTRACE開關
Set autotrace on/off 簡寫 set autot on/off
--返回結果及完整執行計劃
Set autotrace traceonly 簡寫 set autot trace
--不返回結果,只返回完整執行計劃
Set autotrace explain 簡寫 set autot exp
--不返回結果,返回的執行計劃不包括統計信息
Set autotrace statistics 簡寫 set autot stat
--不返回結果,只返回執行計劃的統計信息
10046事件(兩種方式)
啓用
Alter session set events ‘10046 trace name context forever,level 12’;
執行sql語句
關閉
Alter session set events ‘10046 trace name context off’;
獲得trace文件路徑
Select tracefile from v$process where addr=(select paddr from v$session where sid=(select distinct sid from v$mystat));
啓用
Oradebug setmypid --表示準備對當前session使用oradebug命令
Oradebug event 10046 trace name context forever,level 12;
執行sql語句
關閉
Oradebug event 10046 trace name context off;
Oradebug tracefile_name --獲得trace文件路徑
查看trace文件
Tkprof trace文件路徑 新生成文件路徑
示例:
oradebug setospid 33804
oradebug unlimit
oradebug event 10046 trace name context forever,level 12;
oradebug tracefile_name
oradebug event 10046 trace name context off
10053事件
--當SQL語句走了錯誤的執行計劃,並且找不到原因時,可以使用10053事件;此事件時用來診斷優化器如何估算成本和選擇執行計劃的,用它產生的trace文件提供了Oracle如何選擇執行計劃,爲什麼得到這樣的執行計劃
具體用法:
啓用
Alter session set events=’10053 trace name context forever,level 1’;
執行sql語句
關閉
Alter session set events ‘10053 trace name context off’;
注意點:
- 不能使用tkprof格式化工具查看trace文件
- Sql語句必須被硬解析並且使用CBO優化器模式
參考:
http://www.itpub.net/thread-1766504-1-1.html
http://www.itpub.net/thread-1766506-1-1.html
AWR報告或者Statspack報告
讀懂執行計劃
先展示一組簡單的執行計劃;
ID Operation Name
------------------------------------------
0 SELECT STATEMENT
1 HASH GROUP BY
2 HASH JOIN
3 TABLE ACCESS FULL PRODUCTS
4 PARTITION RANGE ALL
5 TABLE ACCESS FULL SALES
-------------------------------------------
根據崔華在《基於Oracle的SQL優化》中寫到的內容,正確查看執行計劃的順序應爲:先從最開頭一直連續往右看,直到看到最右邊並列的地方;對於不併列的,靠右的先執行;如果看到並列的,就從上往下看,對於並列的部分,靠上的先執行。
因此上例中的執行計劃正確順序爲:
3>5>4>2>1>0
【總結】
正確的獲得並讀懂執行計劃是優化語句的第一步,加油吧。