ORACLE執行計劃的介紹

wzq609發表於2014-03-20

執行計劃描述了SQL引擎為執行SQL語句進行的操作;分析SQL語句相關的效能問題或僅僅質疑查詢最佳化器的決定時,必須知道執行計劃;

ORACLE提供了四種方法來獲取執行計劃。

? 執行SQL語句EXPLAIN PLAN,然後查詢結果輸出表。

? 查詢一張動態效能檢視,它顯示快取中庫快取中的執行計劃。

? 查詢自動工作量資料庫或查詢Statspack表,它顯示儲存在資料庫中的執行計劃。

? 啟動提供執行計劃的跟蹤功能。

語句EXPLAIN PLAN

SQL語句EXPLAIN  PLAN的目的是以一條SQL語句作為輸入,得到這條語句的執行計劃和相關資訊,並將它們作為輸出儲存在計劃表中,原理是透過它可以詢問查詢最佳化器,對給定的是SQL語句會採用怎樣的執行計劃;

? 支援的SQL語句:SELECT 、INSERT、UPDATA、MERGE、DELETE、CREATE TABLE、CREATE INDEX和ALTER  INDEX;

? 語句的語法:

1、輸入語句:EXPLAIN PLAN FOR  SELECT  * FROM TABLE;

2、檢視查詢最佳化器的執行計劃:SELECT * FROM TABLE(dbms_xplan.display);

? 使用缺陷:繫結變數的陷阱;

? 避免辦法:

A)在解析執行計劃的時候也用繫結變數輸入,但是繫結變數預設的是用VARCHAR2型別的,因此,為了避免飲食轉換,資料庫引擎自動新增一個顯示轉換。

B)對所有不是VARCHAR2型別的繫結變數使用顯示轉換。

? 該方法沒有真正執行相應的SQL語句。

有四個動態效能檢視展示庫快取中當前的遊標資訊;

? V$sql_plan檢視提供最基礎的資訊和計劃表相同,主要包括執行計劃和查詢最佳化器提供的一些相關資訊。此檢視和計劃表唯一顯著的不同點在於,它有一些欄位可用來標識與庫快取中的執行計劃和相關遊標;

? V$sql_plan_statistics。檢視為v$sql_plan檢視中的每一個操作,諸如用掉的時間和產生的記錄數,它提供了執行計劃的執行時行為。

? 檢視動態效能檢視:

? 根據sql語句查詢相應的sql_id:

SQL > select * from v$sql  where sql_text like 'select * from ';

? 檢視相應的執行計劃:

SQL > SELECT * FROM TABLE(dbms_xplan.display_cursor(‘sql_id’,child number)

和Statspack

當採集快照(snapshot)的時候,awr和statspack就能夠收集執行計劃。為了得到執行計劃,需要查詢前面一節提到的動態效能檢視。一旦完成,執行計劃透過企業管理器用報告或awr展示出來;

存放在awr報告中的執行計劃,都是一段時間內比較消耗資源的sql語句;

? Awr報告可以在檢視dba_hist_sql_plan中查到;select * from dba_hist_sql_plan;

? 執行計劃可以透過display_awr進行檢視;select * from table(dbms_xplan.display_awr('sql_id'));

? 10053事件

10053可以產生跟蹤檔案,詳細記錄語句的產生內容;

Alter session set  events ‘10053 trace name context forever’;  開啟跟蹤;

Alter session set  events ‘10053 trace name context off’;關閉跟蹤;

? 10132事件

透過10132事件也可以產生一個跟蹤檔案,檔案將包含每一個硬解析的執行計劃。

Alter session set  events ‘10132  trace name context forever’;  開啟跟蹤;

Alter session set  events ‘10132  trace name context off’;關閉跟蹤;

執行計劃大家都知道這個東西,關於執行計劃的獲取我們也知道了主要的幾種方法,現在和大家學習執行計劃解讀;

執行計劃是一個樹形結構,不僅闡述了SQL引擎執行操作的順序,也闡明瞭他們之間的關係。樹的每一個節點都代表一個操作,比如,表訪問、連線或排序。

在各操作節點之間,存在父子關係,控制父子關係的規則如下:

? 父有一個或者多個子。

? 子只有一個父

? 唯一沒有父的操作是根;

? 子節點都會在父節點縮排的右側,所有的子節點的縮排都是一致的;

? 父節點的id小於子節點,最靠近子節點是他的父幾點;

--------------------------------------------------------------------------------------------------

| Id  | Operation                                | Name            | Rows   | Bytes  | Cost (%CPU) | Time     |

-------------------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                |                       |     1      |          5 |     13902   (2) | 00:02:47 |

|   1 |  SORT AGGREGATE                 |                       |     1      |          5 |                         |               |

|* 2 |   INDEX FAST FULL SCAN      | MSEG~WZQ |  5300K|    25M |       13901   (2)| 00:02:47 |

----------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - filter("WERKS"='1100')

? 執行順序:從子節點到父節點;子節點之間從上往下執行;

? *星號代表該執行計劃有過濾條件;

? Filter代表把結果查詢出來後再進行過濾;

? Access代表對資料查詢的時候就進行過濾;(Access的效率會比Filter高)

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

相關文章