ORACLE執行計劃的介紹
執行計劃描述了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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解索引:MySQL執行計劃詳細介紹索引MySql
- ORACLE執行計劃Oracle
- 介紹幾種獲取SQL執行計劃的方法(上)SQL
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- oracle 固定執行計劃Oracle
- Oracle sql執行計劃OracleSQL
- oracle sqlprofile 固定執行計劃,並遷移執行計劃OracleSQL
- 看懂Oracle中的執行計劃Oracle
- ORACLE執行計劃的檢視Oracle
- oracle執行計劃的使用(EXPLAIN)OracleAI
- Oracle中檢視已執行sql的執行計劃OracleSQL
- Oracle執行計劃詳解Oracle
- oracle固定執行計劃--sqlprofileOracleSQL
- Oracle 索引和執行計劃Oracle索引
- Oracle閱讀執行計劃Oracle
- oracle執行計劃相關Oracle
- oracle 執行計劃變更Oracle
- 【優化】Oracle 執行計劃優化Oracle
- oracle 執行計劃設定Oracle
- Oracle檢視執行計劃的命令Oracle
- Oracle訪問表的執行計劃Oracle
- Oracle獲取執行計劃的方法Oracle
- oracle檢視執行計劃的方法Oracle
- 怎樣看懂Oracle的執行計劃Oracle
- 解析Oracle執行計劃的結果Oracle
- Oracle 檢視SQL的執行計劃OracleSQL
- Oracle-繫結執行計劃Oracle
- 【SPM】Oracle如何固定執行計劃Oracle
- Oracle檢視執行計劃(五)Oracle
- Oracle檢視執行計劃(六)Oracle
- Oracle檢視執行計劃(一)Oracle
- Oracle檢視執行計劃(二)Oracle
- Oracle檢視執行計劃(三)Oracle
- Oracle檢視執行計劃(四)Oracle
- ORACLE執行計劃 explain說明OracleAI
- ORACLE:什麼是執行計劃Oracle
- oracle分割槽表執行計劃Oracle