項目須要,要獲取oracle的sql的對應的執行計劃,以前mysql的版本已經實現過了。mysql的執行計劃能夠參考這個博客: mysql
http://my.oschina.net/zimingforever/blog/60233 sql
首先toad,PLsql這類工具自己就帶有查看執行計劃的功能,如何經過sql命令來實現呢 shell
A設置autotrace,autotrace有如下幾種取值 數據庫
SET AUTOTRACE OFF 此爲默認值,即關閉Autotrace SET AUTOTRACE ON EXPLAIN 只顯示執行計劃 SET AUTOTRACE ON STATISTICS 只顯示執行的統計信息 SET AUTOTRACE ON 包含2,3兩項內容 SET AUTOTRACE TRACEONLY 與ON類似,但不顯示語句的執行結果因爲本機沒有試驗環境,因此直接從網上摘了個demo,執行效果以下:
SQL> set autotrace on SQL> select * from dave; ID NAME ---------- ---------- 8 安慶 1 dave 2 bl 1 bl 2 dave 3 dba 4 sf-express 5 dmm 已選擇8行。 執行計劃 ---------------------------------------------------------- Plan hash value: 3458767806 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 8 | 64 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| DAVE | 8 | 64 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- 統計信息 ---------------------------------------------------------- 0 recursive calls 0 db block gets 4 consistent gets 0 physical reads 0 redo size 609 bytes sent via SQL*Net to client 416 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 8 rows processedB 是使用explain的SQL來查看,語法是explain plan for sql
explain plan for select * from ZZ_TEST而後調用以下語句來顯示結果
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
select * from table(dbms_xplan.display);顯示結果以下:
Plan hash value: 1944298366 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 5 | 40 | 15 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| ZZ_TEST | 5 | 40 | 15 (0)| 00:00:01 | -----------------------------------------------------------------------------
執行計劃出來了,接下來咱們要看懂每個字段的含義了。 express
id是一個序號,可是並不表示執行的前後順序,執行的前後順序與縮進有關。 oracle
operation表示當前操做的內容。 工具
row表示當前操做的的cardinality,是對當前操做返回結果集的一個估計值。 性能
cost表示一個代價的值 優化
time是估計的執行時間。 .net
接下來是統計信息裏的一些字段:
db block gets,表示從buffer cache中讀取的block數量
consistent gets,表示從buffer cache中讀取的undo數據的block數量。
physical reads,表示從磁盤上讀取的block數量。
redo size,表示dml生成的redo的大小。
sorts(memory),表示在內存上執行的排序量。
sorts(disk),表示在硬盤上執行的排序量。
Physical Reads一般是咱們最關心的,若是這個值很高,說明要從磁盤請求大量的數據到Buffer Cache裏,一般意味着系統裏存在大量全表掃描的SQL語句,這會影響到數據庫的性能,所以儘可能避免語句作全表掃描,對於全表掃描的SQL語句,建議增 加相關的索引,優化SQL語句來解決。內容參考:
http://blog.csdn.net/tianlesoftware/article/details/5827245
不過我今天在程序裏使用的一個歷史版本的查看執行計劃的方法。我沒有封裝,直接使用的原有的方法:
explain PLAN set statement_id= '1111' for select * from ZZ_TEST
SELECT ID, REPLACE ( LPAD (' ', 4 *(LEVEL - 1)), ' ', ' ' ) || operation || ' ' || options operation, optimizer, DECODE ( object_name, NULL, NULL, object_owner || '.' || object_name ) object_name, COST, CARDINALITY, other_tag, access_predicates, filter_predicates, bytes FROM plan_table A START WITH ID = 0 AND STATEMENT_ID = '1111' CONNECT BY PRIOR ID = parent_id AND STATEMENT_ID = '1111'
結果以下:
在執行問這個後須要手動執行下del操做
delete plan_table where statement_id=1111
這裏有個參考文檔:
http://www.iteye.com/topic/586256
總結一下:這裏咱們須要學會用sql語句來查看orale的執行計劃和統計信息,知道執行計劃和統計信息中各個字段的含義。