dbms_xplan之display_cursor函数的使用
文章來(lái)源:http://blog.csdn.net/leshami/article/details/6866925
DBMS_XPLAN包中display_cursor函數(shù)不同于display函數(shù),display_cursor用于顯示SQL語(yǔ)句的真實(shí)的執(zhí)行計(jì)劃,在大多數(shù)情況下,顯示真實(shí)
的執(zhí)行計(jì)劃有助于更好的分析SQL語(yǔ)句的全過(guò)程,尤其是運(yùn)行此SQL語(yǔ)句實(shí)時(shí)的I/O開(kāi)銷。通過(guò)對(duì)比預(yù)估的I/O與真實(shí)的I/O開(kāi)銷來(lái)判斷SQL語(yǔ)句所存
在問(wèn)題,如缺少統(tǒng)計(jì)信息,SQL語(yǔ)句執(zhí)行的次數(shù),根據(jù)實(shí)際中間結(jié)果集的大小來(lái)選擇合適的連接方式等。本文僅僅講述display_cursor函數(shù)的使
用。
一、display_cursor函數(shù)用法
1、display_cursor函數(shù)語(yǔ)法
[sql] view plain copy
2、display_cursor函數(shù)參數(shù)描述
sql_id
指定位于庫(kù)緩存執(zhí)行計(jì)劃中SQL語(yǔ)句的父游標(biāo)。默認(rèn)值為null。當(dāng)使用默認(rèn)值時(shí)當(dāng)前會(huì)話的最后一條SQL語(yǔ)句的執(zhí)行計(jì)劃將被返回
可以通過(guò)查詢V$SQL 或 V$SQLAREA的SQL_ID列來(lái)獲得SQL語(yǔ)句的SQL_ID。
child_number
指定父游標(biāo)下子游標(biāo)的序號(hào)。即指定被返回執(zhí)行計(jì)劃的SQL語(yǔ)句的子游標(biāo)。默認(rèn)值為0。如果為null,則sql_id所指父游標(biāo)下所有子游標(biāo)
的執(zhí)行計(jì)劃都將被返回。
format
控制SQL語(yǔ)句執(zhí)行計(jì)劃的輸出部分,即哪些可以顯示哪些不顯示。使用與display函數(shù)的format參數(shù)與修飾符在這里同樣適用。
除此之外當(dāng)在開(kāi)啟statistics_level=all時(shí)或使用gather_plan_statistics提示可以獲得執(zhí)行計(jì)劃中實(shí)時(shí)的統(tǒng)計(jì)信息
有關(guān)詳細(xì)的format格式描述請(qǐng)參考:dbms_xplan之display函數(shù)的使用 中format參數(shù)的描述
二、演示使用display_cursor函數(shù)獲取執(zhí)行計(jì)劃?
1、當(dāng)前數(shù)據(jù)庫(kù)版本以及加載執(zhí)行計(jì)劃到庫(kù)緩存?
[sql] view plain copy
[sql] view plain copy
/*----------------不傳遞任何參數(shù)給display_cursor函數(shù),顯示當(dāng)前會(huì)話最后一條SQL語(yǔ)句的執(zhí)行計(jì)劃-------------*/ /**************************************************/ /* Author: Robinson Cheng */ /* Blog: http://blog.csdn.net/robinson_0612 */ /* MSN: robinson_0612@hotmail.com */ /* QQ: 645746311 */ /**************************************************/ SQL> select * from table(dbms_xplan.display_cursor(null,null)); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------ SQL_ID a67wqmkfb9j65, child number 0 ------------------------------------- SELECT ename,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno AND e.empno = 7788 Plan hash value: 2385808155 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 3 (100)| | | 1 | NESTED LOOPS | | 1 | 63 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 33 | 2 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 1 (0)| 00:00:01 | | 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 409 | 12270 | 1 (0)| 00:00:01 | |* 5 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| | ---------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("E"."EMPNO"=7788) 5 - access("E"."DEPTNO"="D"."DEPTNO") /*------------------- 獲得SQL語(yǔ)句的SQL_ID,可以看出此SQL_ID與上面顯示的執(zhí)行計(jì)劃中的SQL_ID一致 ----------*/ SQL> select sql_id,address,plan_hash_value,hash_value,child_number from v$sql 2 where sql_text like '%SELECT ename%' and sql_text not like '%from v$sql%'; SQL_ID ADDRESS PLAN_HASH_VALUE HASH_VALUE CHILD_NUMBER ------------- ---------------- --------------- ---------- ------------ a67wqmkfb9j65 0000000091DBFBC8 2385808155 2629092549 0 /*-------------- 傳遞SQL_ID以及format參數(shù),并配合修飾符控制執(zhí)行計(jì)劃的輸出 ------------------------*/ SQL> select * from table(dbms_xplan.display_cursor('a67wqmkfb9j65',null,'typical -predicate -rows')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------ SQL_ID a67wqmkfb9j65, child number 0 ------------------------------------- SELECT ename,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno AND e.empno = 7788 Plan hash value: 2385808155 -------------------------------------------------------------------------------- | Id | Operation | Name | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | 3 (100)| | | 1 | NESTED LOOPS | | 63 | 3 (0)| 00:00:01 | | 2 | TABLE ACCESS BY INDEX ROWID| EMP | 33 | 2 (0)| 00:00:01 | | 3 | INDEX UNIQUE SCAN | PK_EMP | | 1 (0)| 00:00:01 | | 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 12270 | 1 (0)| 00:00:01 | | 5 | INDEX UNIQUE SCAN | PK_DEPT | | 0 (0)| | -------------------------------------------------------------------------------- 3、查看真實(shí)執(zhí)行計(jì)劃并獲得統(tǒng)計(jì)信息 前提條件 設(shè)置參數(shù)statistics_level為all,可以基于session級(jí)別以及實(shí)例級(jí)別 或者啟用gather_plan_statistics提示[sql] view plain copy
/*-------------查看實(shí)例參數(shù)statistics_level的值,并在會(huì)話級(jí)別將其設(shè)定為all ---------*/ SQL> show parameter statistics_le NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ statistics_level string ALL SQL> alter session set statistics_level=all; Session altered. SQL> select e.ename,e.sal,s.grade 2 from emp e 3 join salgrade s 4 on e.sal between losal and hisal 5 and e.deptno = 20; ENAME SAL GRADE ---------- ---------- ---------- SCOTT 3000 4 FORD 3000 4 JONES 2975 4 ADAMS 1100 1 SMITH 800 1 /*------- 執(zhí)行上述SQL語(yǔ)句后獲得其真實(shí)的執(zhí)行計(jì)劃,使用了iostats last -predicate -note 修飾符控制顯示輸出 -----*/ SQL> set pagesize 0 SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last -predicate -note')); SQL_ID 243b0tpjxj6wv, child number 0 ------------------------------------- select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between losal and hisal and e.deptno = 20 Plan hash value: 4204027666 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ------------------------------------------------------------------------------------------- | 1 | MERGE JOIN | | 1 | 1 | 5 |00:00:00.01 | 14 | | 2 | SORT JOIN | | 1 | 5 | 5 |00:00:00.01 | 7 | | 3 | TABLE ACCESS FULL | EMP | 1 | 5 | 5 |00:00:00.01 | 7 | | 4 | FILTER | | 5 | | 5 |00:00:00.01 | 7 | | 5 | SORT JOIN | | 5 | 5 | 14 |00:00:00.01 | 7 | | 6 | TABLE ACCESS FULL| SALGRADE | 1 | 5 | 5 |00:00:00.01 | 7 | ------------------------------------------------------------------------------------------- /*---------------- 修改會(huì)話級(jí)別的參數(shù)statistics_level為typical并驗(yàn)證修改結(jié)果 ----------------*/ SQL> alter session set statistics_level=typical; SQL> col name format a40 SQL> col value format a25 SQL> col display_value format a25 SQL> select name, value, display_value, isses_modifiable 2 from v$parameter 3 where isses_modifiable = 'TRUE' 4 and name like '%&input_name%'; Enter value for input_name: statistics_level old 4: and name like '%&input_name%' new 4: and name like '%statistics_level%' NAME VALUE DISPLAY_VALUE ISSES ---------------------------------------- ------------------------- ------------------------- ----- statistics_level TYPICAL TYPICAL TRUE /*-------- 使用提示gather_plan_statistics,并獲得其真實(shí)執(zhí)行計(jì)劃,使用了allstats -rows修飾符控制顯示輸出 ---*/ SQL> set pagesize 180 SQL> SELECT /*+ gather_plan_statistics */ ename,dname,loc 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno 4 AND d.deptno=20 ORDER BY 1,2,3; ENAME DNAME LOC ---------- -------------- ------------- ADAMS RESEARCH DALLAS FORD RESEARCH DALLAS JONES RESEARCH DALLAS SCOTT RESEARCH DALLAS SMITH RESEARCH DALLAS SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats -rows')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------- SQL_ID d2hh42yzqqjz7, child number 0 ------------------------------------- SELECT /*+ gather_plan_statistics */ ename,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno AND d.deptno=20 ORDER BY 1,2,3 Plan hash value: 3339094711 --------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | A-Rows | A-Time | Buffers | OMem | 1Mem | O/1/M | --------------------------------------------------------------------------------------------------------------------- | 1 | SORT ORDER BY | | 1 | 5 |00:00:00.01 | 9 | 2048 | 2048 | 1/0/0| | 2 | NESTED LOOPS | | 1 | 5 |00:00:00.01 | 9 | | | | | 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 1 |00:00:00.01 | 2 | | | | |* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 1 |00:00:00.01 | 1 | | | | |* 5 | TABLE ACCESS FULL | EMP | 1 | 5 |00:00:00.01 | 7 | | | | --------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("D"."DEPTNO"=20) 5 - filter("E"."DEPTNO"=20) Note ----- - dynamic sampling used for this statement三、總結(jié)
1、與display函數(shù)不同,display_cursor顯示的為真實(shí)的執(zhí)行計(jì)劃
2、對(duì)于format參數(shù),使用與display函數(shù)的各個(gè)值,同樣適用于display_cursor函數(shù)
3、當(dāng)statistics_level為all或使用gather_plan_statistics提示可以獲得執(zhí)行時(shí)的統(tǒng)計(jì)信息
4、根據(jù)真實(shí)與預(yù)估的統(tǒng)計(jì)信息可以初步判斷SQL效率低下的原因,如統(tǒng)計(jì)信息的準(zhǔn)確性、主要的開(kāi)銷位于那些步驟等
本文轉(zhuǎn)自xiaocao1314051CTO博客,原文鏈接:?http://blog.51cto.com/xiaocao13140/2056436,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的dbms_xplan之display_cursor函数的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 扩容是元素还是数组_Map扩容源码
- 下一篇: w ndows 高级索引,软媒原创:为W