dbms_xplan的display_cursor查看执行计划

准备工作:

SQL> conn sys/root as
sysdba

Connected.

SQL> grant select on
v_$sql_plan to scott;

Grant succeeded.

SQL> grant select on
v_$session to scott;

Grant succeeded.

SQL> grant select on
v_$sql_plan_statistics_all to scott;

Grant succeeded.

SQL> grant select on
v_$sql to scott;

Grant succeeded.

BMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划.(来自Leshami的dbms_xplan之display函数的使用)。

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

演示使用display_cursor

SQL> set linesize 1000

SQL> SELECT /*+ gather_plan_statistics */ * FROM   emp e, dept d
WHERE  e.deptno = d.deptno AND    e.ename  =
‘CLARK‘;

EMPNO ENAME      JOB 
       MGR
HIREDATE         
    SAL      
COMM     DEPTNO   DEPTNO
DNAME            
LOC

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

7782 CLARK     
MANAGER          7839
09-JUN-81      2450
                  
   10      
      10
ACCOUNTING         NEW YORK

SQL> select * from table(dbms_xplan.display_cursor);--采用默认

PLAN_TABLE_OUTPUT

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

SQL_ID     6xyy7vuxqk5vt, child number 0

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

SELECT * FROM        emp e, dept d
WHERE  e.deptno = d.deptno
AND         e.ename

= ‘CLARK‘

Plan hash value: 3625962092

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

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

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

|   0 | SELECT STATEMENT       
|           
|       |      
|     4 (100)|        
|

PLAN_TABLE_OUTPUT

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

|   1 |  NESTED
LOOPS                 
     |    
       |      
|       |    
|              |

|   2 |   NESTED
LOOPS               
     |    
       |     1
|    58 |    
4        (0)| 00:00:01 |

|*  3 |    TABLE ACCESS FULL    
     | EMP     |    
1 |    38 |    
3        (0)| 00:00:01 |

|*  4 |    INDEX UNIQUE SCAN      
| PK_DEPT |     1 |      
|     0        
(0)|        
       |

|   5 |   TABLE ACCESS BY INDEX ROWID|
DEPT    |     1 |    20
|     1    (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

3 - filter("E"."ENAME"=‘CLARK‘)

PLAN_TABLE_OUTPUT

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

4 - access("E"."DEPTNO"="D"."DEPTNO")

24 rows selected.

总结

1、与display函数不同,display_cursor显示的为真实的执行计划

2、对于format参数,使用与display函数的各个值,同样适用于display_cursor函数

3、当statistics_level为all或使用gather_plan_statistics提示可以获得执行时的统计信息

4、根据真实与预估的统计信息可以初步判断SQL效率低下的原因,如统计信息的准确性、主要的开销位于那些步骤等

时间: 2024-08-09 02:21:00

dbms_xplan的display_cursor查看执行计划的相关文章

DBMS_XPLAN Package来查看执行计划

查看执行计划除了AUTOTRACE的方法外,还可以使用DBMS_XPLAN Package来查看 1.执行"explain Plan"语法:SQL> Explain plan forTry this command:SQL> explain plan for select * from mtl_system_items_b where inventory_item_id = 149 and organization_id = 207;Explained这个命令会产生执行计划

dbms_xplan的display查看执行计划

DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用 display函数,而实际的执行计划则是用display_cursor函数,对于awr中的执行计划,则是用display_awr函数,而SQL tuning集合中的执行计划 则由display_sqlset来完成(来自Leshami的dbms_xplan之display函数的使用). 函数语法: DBMS_XPLAN.DISPLAY( table_name   

Oracle 查看执行计划问题

一.描述在查看执行计划测试的过程中遇到使用dbms_xplan.display无法查看执行计划,发现是因为之前在测试的过程中打开了set autot on,关闭后(set autot off) ,执行计划可以正常显示. 二.操作过程 SQL> SQL> explain plan for select count(*) from tt; Explained. Elapsed: 00:00:00.00 SQL> set lines 200 pages 2000 SQL> select

dbms_xplan.display_awr方式获取执行计划的实验和之前的误导

<查看Oracle执行计划的几种常用方法-系列1>(http://blog.csdn.net/bisal/article/details/38919181)这篇博文中曾提到一个隐藏问题: "隐藏问题2: 实验这部分内容发现使用select * from table(dbms_xplan.display_awr('sql_id'));并没有结果,@黄玮老师说有可能是AWR收集的是top的SQL,有可能测试用的SQL不是most intensive SQL,但我是用alter syste

oracle如何查看执行计划

1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + 目标SQL select * from table(dbms_xplan.display)3. DBMS_XPLAN 包 1) select * from table(dbms_xplan.display_cursor(null,null,'advanced')) 它用于在SQLPLUS中查看刚刚

简单对比查看执行计划的两种方法EXPLAIN PLAN 和 AUTOTRACE

EXPLAIN PLAN 和 AUTOTRACE 都可以查看执行计划. 值得一提的是:前者只是优化器通过读取数据字典的统计信息做出'最佳'访问路径判断,并没有真正去执行语句:后者是实际去执行了SQL语句,同时把访问记录数.执行计划.统计信息等打印出来. 下面粘出实验结果加以说明,注意对比两者的耗时: <p>SQL> CONNECT /AS SYSDBA Connected.</p><p>SQL> SET LINESIZE 300; SQL> SET T

如何查看执行计划以及执行计划的准确性

下面的执行计划是怎么打印出来的,很多朋友还是不知道.其实语句只有三条: explain plan for 你要查看的SQL语句; commit; select * from table(dbms_xplan.display); -----分割线---------------------------------- 先告诉大家一个原则,看执行计划的时候,从第一行开始向右下看,一直到最右边.如果有并列的,那么先上再下.如果没并列,右边的先执行. 闲话少说,先上图吧: 这是一个简单的SQL的执行计划,这

Oracle数据库查看执行计划

基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行优化做相应说明. 一.什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述. 二.如何查看执行计划 1: 在PL/SQL下按F5查看执行计划.第三方工具toad等. 很多人以为PL/SQL的执行计划只能看到基数.优化器.耗

T-SQL备忘(5):查看执行计划

先理解几个概念:表扫描.聚集索引扫描.聚集索引查找.索引扫描.书签查找. [查看执行计划] 在理解概念之前先得知道如何查看执行计划—Ctrl+L.如下图: 注:SQL Server的执行计划是从右向左看的. [理解几个概念] 1.表扫描(Table scan):发生于堆表,并且没有可用的索引可用时,会发生表扫描,表示整个表扫描一次. select * from T_UserInfo 查看执行计划如下: 2.聚集索引扫描(Clustered Index Scan):发生于聚集表,也相当于全表扫描操