DBMS_XPLAN.DISPLAY_CURSOR()看執行計劃

zhangsharp20發表於2014-09-18

我們可以很容易的得到一個SQL的執行計劃。

如果一個SQL已經執行過了,我們怎麼檢視他真實的執行計劃呢。

如果知道已執行SQL的 SQL_ID,或HASH_VALUE.

在10g中利用DBMS_XPLAN.DISPLAY_CURSOR()可以很方便地查詢到已執行SQL的執行計劃。


SQL> desc dbms_xplan
FUNCTION DISPLAY_CURSOR RETURNS DBMS_XPLAN_TYPE_TABLE
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SQL_ID                         VARCHAR2                IN     DEFAULT
 CURSOR_CHILD_NO                NUMBER(38)              IN     DEFAULT
 FORMAT                         VARCHAR2                IN     DEFAULT
 
 雖然要求入參是SQL_ID。由於SQL_ID和HASH_VALUE本質上是一樣的。

所以這裡用 SQL_ID和HASH_VALUE都可以。
 
oracle官方文件中的部分說明:
DISPLAY_CURSOR Function
This table function displays the explain plan of any cursor loaded in the cursor cache. 
In addition to the explain plan, various plan statistics (such as. I/O, memory and timing)
can be reported (based on the V$SQL_PLAN_STATISTICS_ALL VIEWS).

Syntax
DBMS_XPLAN.DISPLAY_CURSOR(
   sql_id        IN  VARCHAR2  DEFAULT  NULL,
   child_number  IN  NUMBER    DEFAULT  NULL, 
   format        IN  VARCHAR2  DEFAULT  'TYPICAL');


--1.執行一個SQL
SELECT /* TOTO */ ename, dname 
FROM dept d join emp e USING (deptno);


--2.獲取這個SQL的sql_id和 child_number

SELECT sql_id, child_number
FROM v$sql 
WHERE sql_text LIKE '%TOTO%';

SQL_ID         CHILD_NUMBER
----------     -----------------------------
gwp663cqh5qbf   0


--3.根據sql_id就可以顯示剛才那個SQL的執行計劃
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('gwp663cqh5qbf',0));


--4.顯示出的執行計劃如下
Plan hash value: 3693697075, SQL ID: gwp663cqh5qbf, child number: 0
--------------------------------------------------------
SELECT /* TOTO */ ename, dname 
FROM dept d JOIN emp e USING (deptno);

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |       |       |     7 (100)|          |
|   1 |  SORT GROUP BY      |      |     4 |    64 |     7  (43)| 00:00:01 |
|*  2 |   HASH JOIN         |      |    14 |   224 |     6  (34)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| DEPT |     4 |    44 |     3  (34)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| EMP  |    14 |    70 |     3  (34)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("E"."DEPTNO"="D"."DEPTNO")

--5.也可以與v$sql關聯,直接查已執行sql的執行計劃。個人還是喜歡第一種方法。

SELECT t.*
  FROM v$sql s,
       table(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number)) t
 WHERE sql_text LIKE '%TOTO%';

轉自:http://blog.csdn.net/lwei_998/article/details/6049744

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

相關文章