大佬教程收集整理的这篇文章主要介绍了执行计划display_cursor函数,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
问题描述:关于Oracle查看真实的执行计划,使用SELEct * FROM table(DBMS_xplan.display_cursor(null,null));的方式来获取执行计划
参考文档:https://blog.csdn.net/leshami/article/details/6866925
display_cursor用于显示sql语句的真实的执行计划
disPLAY_cursOR语法
DBMS_XPLAN.disPLAY_cursOR(
sql_ID IN VARCHAR2 DEFAulT NulL,child_number IN numbER DEFAulT NulL,format IN VARCHAR2 DEFAulT 'TYPICAL');
display_cursor函数参数描述
sql_ID
指定位于库缓存执行计划中sql语句的父游标。默认值为null。当使用默认值时当前会话的最后一条sql语句的执行计划将被返回可以通过查询v$sql 或 v$sqlAREA的sql_ID列来获得sql语句的sql_ID。
child_number
指定父游标下子游标的序号。即指定被返回执行计划的sql语句的子游标。默认值为0。如果为null,则sql_ID所指父游标下所有子游标的执行计划都将被返回。
format
控制sql语句执行计划的输出部分,即哪些可以显示哪些不显示。使用与display函数的format参数与修饰符在这里同样适用。
除此之外当在开启statistics_level=all时或使用gather_plan_statistics提示可以获得执行计划中实时的统计信息
有关详细的format格式描述请参考:DBMS_xplan之display函数的使用 中format参数的描述
下面给出启用统计信息时format新增的修饰符
iostats 控制I/O统计的显示
last 默认,显示所有执行计算过的统计。如果指定该值,则只显示最后一次执行的统计信息
memstats 控制pga相关统计的显示
allstats 此为iostats memstats的快捷方式,即allstats包含了iostats和memstats
run_stats_last 等同于iostats last。只能用于Oracle 10g R1
run_stats_tot 等同于iostats。只能用于Oracle 10g R1
sql> show user
USER is "SCott"
sql> SELEct * from v$version where rownum<2;
BAnnER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
sql>
sql> SELECT ename,dname,loc
FROM emp e,DEPT d
WHERE e.deptno = d.deptno
AND e.empno = 7788; 2 3 4
ename Dname LOC
---------- -------------- -------------
SCott RESEARCH DALLAS
sql> SELEct * FROM table(DBMS_xplan.display_cursor(null,null));
PLAN_table_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sql_ID a67wqmkfb9j65,child number 0
-------------------------------------
SELECT ename,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 | | | | 2 (100)| |
| 1 | nested loops | | 1 | 54 | 2 (0)| 00:00:01 |
| 2 | table ACCESS BY INDEX ROWID| EMP | 1 | 24 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| |
| 4 | table ACCESS BY INDEX ROWID| DEPT | 1 | 30 | 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")
24 rows SELEcted.
sql> SELEct sql_ID,address,plan_hash_value,hash_value,child_number from v$sql
where sql_text like '%SELECT ename%' and sql_text not like '%from v$sql%'; 2
sql_ID ADDRESS PLAN_hash_value hash_value CHILD_numbER
------------- ---------------- --------------- ---------- ------------
a67wqmkfb9j65 0000000072C8C9D8 2385808155 2629092549 0
/*-------------- ------------------------*/
sql> SELEct * FROM table(DBMS_xplan.display_cursor('a67wqmkfb9j65',null,'typical -preDicate -rows'));
PLAN_table_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sql_ID a67wqmkfb9j65,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 | | | 2 (100)| |
| 1 | nested loops | | 54 | 2 (0)| 00:00:01 |
| 2 | table ACCESS BY INDEX ROWID| EMP | 24 | 1 (0)| 00:00:01 |
| 3 | INDEX UNIQUE SCAN | PK_EMP | | 0 (0)| |
| 4 | table ACCESS BY INDEX ROWID| DEPT | 30 | 1 (0)| 00:00:01 |
| 5 | INDEX UNIQUE SCAN | PK_DEPT | | 0 (0)| |
--------------------------------------------------------------------------------
18 rows SELEcted.
scott用户遇到的问题一:User has no SELECT privilege on v$sesSION
sql> r
1* SELEct * FROM table(DBMS_xplan.display_cursor(null,null))
PLAN_table_OUTPUT
--------------------------------------------------------------------------------
User has no SELECT privilege on v$sesSION
解决:
grant SELEct on v_$sql to scott;
grant SELEct on v_$sql_plan to scott;
grant SELEct on v_$session to scott;
grant SELEct on v_$sql_plan_statistics_all to scott;
问题二:cAnnot fetch plan for sql_ID: 372mc93u1j1yk
sql> r
1* SELEct * FROM table(DBMS_xplan.display_cursor(null,null))
PLAN_table_OUTPUT
--------------------------------------------------------------------------------
sql_ID 372mc93u1j1yk,child number 0
SELEct * FROM table(DBMS_xplan.display_cursor(null,null))
NOTE: cAnnot fetch plan for sql_ID: 372mc93u1j1yk,CHILD_numbER: 0
Please verify value of sql_ID and CHILD_numbER;
It Could also be that the plan is no longer in cursor cache (check v$sql_p
lan)
解决:
sql> set serveroutput off;
sql> show serveroutput
serveroutput OFF
sql> alter session set statistics_level=all;
Session altered.
sql> SELEct @R_801_5545@,e.sal,s.grade
from emp e
join salgrade s 2 3
on e.sal between losal and hisal
and e.deptno = 20; 4 5
ename SAL GRADE
---------- ---------- ----------
SMITH 800 1
JOnes 2975 4
SCott 3000 4
AdamS 1100 1
FORD 3000 4
sql> SELEct * FROM table(DBMS_xplan.display_cursor(null,'iostats last -preDicate -note'));
sql_ID 243b0tpjxj6wv,child number 1
-------------------------------------
SELEct @R_801_5545@,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 |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 5 |00:00:00.01 | 13 |
| 1 | merge join | | 1 | 1 | 5 |00:00:00.01 | 13 |
| 2 | SORT JOIN | | 1 | 5 | 5 |00:00:00.01 | 6 |
| 3 | table ACCESS FulL | EMP | 1 | 5 | 5 |00:00:00.01 | 6 |
| 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 |
-------------------------------------------------------------------------------------------
19 rows SELEcted.
sql> col name format a40
col value format a25
col display_value format asql> sql> 25
SELEct name,value,display_value,isses_modifiable
from v$parameter sql> 2
where isses_modifiable = 'TRUE'
and name like '%&input_name%'; 3 4
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
sql> set pagesize 180
SELECT /*+ gather_plan_statistics */ ename,loc
FROM emp e,DEPT d sql> 2
WHERE e.deptno = d.deptno
AND d.deptno=20 ORDER BY 1,2,3; 3 4
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,'allstats -rows'));
PLAN_table_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sql_ID d2hh42yzqqjz7,child number 0
-------------------------------------
SELECT /*+ gather_plan_statistics */ ename,dept
d WHERE e.deptno = d.deptno AND d.deptno=20 ORDER BY 1,3
Plan hash value: 3339094711
---------------------------------------------------------------------------------------------------------------------
| ID | Operation | name | Starts | A-Rows | A-Time | Buffers | OMem | 1Mem | O/1/M |
---------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 |00:00:00.01 | 8 | | | |
| 1 | SORT ORDER BY | | 1 | 5 |00:00:00.01 | 8 | 2048 | 2048 | 1/0/0|
| 2 | nested loops | | 1 | 5 |00:00:00.01 | 8 | | | |
| 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 | 6 | | | |
---------------------------------------------------------------------------------------------------------------------
PreDicate information (IDentifIEd by operation ID):
---------------------------------------------------
4 - access("D"."DEPTNO"=20)
5 - filter("E"."DEPTNO"=20)
24 rows SELEcted.
以上是大佬教程为你收集整理的执行计划display_cursor函数全部内容,希望文章能够帮你解决执行计划display_cursor函数所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。