DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,显示真实
的执行计划有助于更好的分析SQL语句的全过程,尤其是运行此SQL语句实时的I/O开销。通过对比预估的I/O与真实的I/O开销来判断SQL语句所存
在问题,如缺少统计信息,SQL语句执行的次数,根据实际中间结果集的大小来选择合适的连接方式等。本文仅仅讲述display_cursor函数的使
用。

有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述 
        有关由SQL语句来获取执行计划请参考:     使用 EXPLAIN PLAN 获取SQL语句执行计划 
        有关使用autotrace来获取执行计划请参考: 启用 AUTOTRACE 功能
        有关dbms_xplan之display函数请参考:     dbms_xplan之display函数的使用

一、display_cursor函数用法
1、display_cursor函数语法

  1. DBMS_XPLAN.DISPLAY_CURSOR(
  2. sql_id        IN  VARCHAR2  DEFAULT  NULL,
  3. child_number  IN  NUMBER    DEFAULT  NULL,
  4. format        IN  VARCHAR2  DEFAULT  'TYPICAL');

2、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函数获取执行计划    
        1、当前数据库版本以及加载执行计划到库缓存

  1. SQL> select * from v$version where rownum<2;
  2. BANNER
  3. ----------------------------------------------------------------
  4. Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
  5. SQL> SELECT ename,dname,loc
  6. 2  FROM   emp e, dept d
  7. 3  WHERE  e.deptno = d.deptno
  8. 4  AND    e.empno  = 7788;
  9. ENAME      DNAME          LOC
  10. ---------- -------------- -------------
  11. SCOTT      RESEARCH       DALLAS

2、查看真实的执行计划

  1. /*----------------不传递任何参数给display_cursor函数,显示当前会话最后一条SQL语句的执行计划-------------*/
  2. /**************************************************/
  3. /* Author: Robinson Cheng                         */
  4. /* Blog:   http://blog.csdn.net/robinson_0612     */
  5. /* MSN:    robinson_0612@hotmail.com              */
  6. /* QQ:     645746311                              */
  7. /**************************************************/
  8. SQL> select * from table(dbms_xplan.display_cursor(null,null));
  9. PLAN_TABLE_OUTPUT
  10. ------------------------------------------------------------------------------------------
  11. SQL_ID  a67wqmkfb9j65, child number 0
  12. -------------------------------------
  13. SELECT ename,dname,loc FROM   emp e, dept d WHERE  e.deptno = d.deptno AND
  14. e.empno  = 7788
  15. Plan hash value: 2385808155
  16. ----------------------------------------------------------------------------------------
  17. | Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
  18. ----------------------------------------------------------------------------------------
  19. |   0 | SELECT STATEMENT             |         |       |       |     3 (100)|          |
  20. |   1 |  NESTED LOOPS                |         |     1 |    63 |     3   (0)| 00:00:01 |
  21. |   2 |   TABLE ACCESS BY INDEX ROWID| EMP     |     1 |    33 |     2   (0)| 00:00:01 |
  22. |*  3 |    INDEX UNIQUE SCAN         | PK_EMP  |     1 |       |     1   (0)| 00:00:01 |
  23. |   4 |   TABLE ACCESS BY INDEX ROWID| DEPT    |   409 | 12270 |     1   (0)| 00:00:01 |
  24. |*  5 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)|          |
  25. ----------------------------------------------------------------------------------------
  26. Predicate Information (identified by operation id):
  27. ---------------------------------------------------
  28. 3 - access("E"."EMPNO"=7788)
  29. 5 - access("E"."DEPTNO"="D"."DEPTNO")
  30. /*------------------- 获得SQL语句的SQL_ID,可以看出此SQL_ID与上面显示的执行计划中的SQL_ID一致 ----------*/
  31. SQL> select sql_id,address,plan_hash_value,hash_value,child_number from v$sql
  32. 2  where sql_text like '%SELECT ename%' and sql_text not like '%from v$sql%';
  33. SQL_ID        ADDRESS          PLAN_HASH_VALUE HASH_VALUE CHILD_NUMBER
  34. ------------- ---------------- --------------- ---------- ------------
  35. a67wqmkfb9j65 0000000091DBFBC8      2385808155 2629092549            0
  36. /*-------------- 传递SQL_ID以及format参数,并配合修饰符控制执行计划的输出 ------------------------*/
  37. SQL> select * from table(dbms_xplan.display_cursor('a67wqmkfb9j65',null,'typical -predicate -rows'));
  38. PLAN_TABLE_OUTPUT
  39. ------------------------------------------------------------------------------------
  40. SQL_ID  a67wqmkfb9j65, child number 0
  41. -------------------------------------
  42. SELECT ename,dname,loc FROM   emp e, dept d WHERE  e.deptno = d.deptno
  43. AND    e.empno  = 7788
  44. Plan hash value: 2385808155
  45. --------------------------------------------------------------------------------
  46. | Id  | Operation                    | Name    | Bytes | Cost (%CPU)| Time     |
  47. --------------------------------------------------------------------------------
  48. |   0 | SELECT STATEMENT             |         |       |     3 (100)|          |
  49. |   1 |  NESTED LOOPS                |         |    63 |     3   (0)| 00:00:01 |
  50. |   2 |   TABLE ACCESS BY INDEX ROWID| EMP     |    33 |     2   (0)| 00:00:01 |
  51. |   3 |    INDEX UNIQUE SCAN         | PK_EMP  |       |     1   (0)| 00:00:01 |
  52. |   4 |   TABLE ACCESS BY INDEX ROWID| DEPT    | 12270 |     1   (0)| 00:00:01 |
  53. |   5 |    INDEX UNIQUE SCAN         | PK_DEPT |       |     0   (0)|          |
  54. --------------------------------------------------------------------------------

3、查看真实执行计划并获得统计信息
                前提条件
                        设置参数statistics_level为all,可以基于session级别以及实例级别
                        或者启用gather_plan_statistics提示

  1. /*-------------查看实例参数statistics_level的值,并在会话级别将其设定为all  ---------*/
  2. SQL> show parameter statistics_le
  3. NAME                                 TYPE        VALUE
  4. ------------------------------------ ----------- ------------------------------
  5. statistics_level                     string      ALL
  6. SQL> alter session set statistics_level=all;
  7. Session altered.
  8. SQL> select e.ename,e.sal,s.grade
  9. 2  from emp e
  10. 3  join salgrade s
  11. 4  on e.sal between losal and hisal
  12. 5  and e.deptno = 20;
  13. ENAME             SAL      GRADE
  14. ---------- ---------- ----------
  15. SCOTT            3000          4
  16. FORD             3000          4
  17. JONES            2975          4
  18. ADAMS            1100          1
  19. SMITH             800          1
  20. /*------- 执行上述SQL语句后获得其真实的执行计划,使用了iostats last -predicate -note 修饰符控制显示输出 -----*/
  21. SQL> set pagesize 0
  22. SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last -predicate -note'));
  23. SQL_ID  243b0tpjxj6wv, child number 0
  24. -------------------------------------
  25. select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between losal and
  26. hisal and e.deptno = 20
  27. Plan hash value: 4204027666
  28. -------------------------------------------------------------------------------------------
  29. | Id  | Operation            | Name     | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
  30. -------------------------------------------------------------------------------------------
  31. |   1 |  MERGE JOIN          |          |      1 |      1 |      5 |00:00:00.01 |      14 |
  32. |   2 |   SORT JOIN          |          |      1 |      5 |      5 |00:00:00.01 |       7 |
  33. |   3 |    TABLE ACCESS FULL | EMP      |      1 |      5 |      5 |00:00:00.01 |       7 |
  34. |   4 |   FILTER             |          |      5 |        |      5 |00:00:00.01 |       7 |
  35. |   5 |    SORT JOIN         |          |      5 |      5 |     14 |00:00:00.01 |       7 |
  36. |   6 |     TABLE ACCESS FULL| SALGRADE |      1 |      5 |      5 |00:00:00.01 |       7 |
  37. -------------------------------------------------------------------------------------------
  38. /*---------------- 修改会话级别的参数statistics_level为typical并验证修改结果 ----------------*/
  39. SQL> alter session set statistics_level=typical;
  40. SQL> col name format a40
  41. SQL> col value format a25
  42. SQL> col display_value format a25
  43. SQL> select name, value, display_value, isses_modifiable
  44. 2  from v$parameter
  45. 3  where isses_modifiable = 'TRUE'
  46. 4  and name like '%&input_name%';
  47. Enter value for input_name: statistics_level
  48. old   4: and name like '%&input_name%'
  49. new   4: and name like '%statistics_level%'
  50. NAME                                     VALUE                     DISPLAY_VALUE             ISSES
  51. ---------------------------------------- ------------------------- ------------------------- -----
  52. statistics_level                         TYPICAL                   TYPICAL                   TRUE
  53. /*-------- 使用提示gather_plan_statistics,并获得其真实执行计划,使用了allstats -rows修饰符控制显示输出 ---*/
  54. SQL> set pagesize 180
  55. SQL> SELECT /*+ gather_plan_statistics */ ename,dname,loc
  56. 2  FROM   emp e, dept d
  57. 3  WHERE  e.deptno = d.deptno
  58. 4  AND    d.deptno=20 ORDER BY 1,2,3;
  59. ENAME      DNAME          LOC
  60. ---------- -------------- -------------
  61. ADAMS      RESEARCH       DALLAS
  62. FORD       RESEARCH       DALLAS
  63. JONES      RESEARCH       DALLAS
  64. SCOTT      RESEARCH       DALLAS
  65. SMITH      RESEARCH       DALLAS
  66. SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats -rows'));
  67. PLAN_TABLE_OUTPUT
  68. -------------------------------------------------------------------------------------------------
  69. SQL_ID  d2hh42yzqqjz7, child number 0
  70. -------------------------------------
  71. SELECT /*+ gather_plan_statistics */ ename,dname,loc FROM   emp e, dept d WHERE  e.deptno = d.deptno AND
  72. d.deptno=20 ORDER BY 1,2,3
  73. Plan hash value: 3339094711
  74. ---------------------------------------------------------------------------------------------------------------------
  75. | Id  | Operation                     | Name    | Starts | A-Rows |   A-Time   | Buffers |  OMem |  1Mem |  O/1/M   |
  76. ---------------------------------------------------------------------------------------------------------------------
  77. |   1 |  SORT ORDER BY                |         |      1 |      5 |00:00:00.01 |       9 |  2048 |  2048 |     1/0/0|
  78. |   2 |   NESTED LOOPS                |         |      1 |      5 |00:00:00.01 |       9 |       |       |          |
  79. |   3 |    TABLE ACCESS BY INDEX ROWID| DEPT    |      1 |      1 |00:00:00.01 |       2 |       |       |          |
  80. |*  4 |     INDEX UNIQUE SCAN         | PK_DEPT |      1 |      1 |00:00:00.01 |       1 |       |       |          |
  81. |*  5 |    TABLE ACCESS FULL          | EMP     |      1 |      5 |00:00:00.01 |       7 |       |       |          |
  82. ---------------------------------------------------------------------------------------------------------------------
  83. Predicate Information (identified by operation id):
  84. ---------------------------------------------------
  85. 4 - access("D"."DEPTNO"=20)
  86. 5 - filter("E"."DEPTNO"=20)
  87. Note
  88. -----
  89. - dynamic sampling used for this statement

三、总结
        1、与display函数不同,display_cursor显示的为真实的执行计划
        2、对于format参数,使用与display函数的各个值,同样适用于display_cursor函数
        3、当statistics_level为all或使用gather_plan_statistics提示可以获得执行时的统计信息
        4、根据真实与预估的统计信息可以初步判断SQL效率低下的原因,如统计信息的准确性、主要的开销位于那些步骤等

转载:http://blog.csdn.net/leshami/article/details/6866925

dbms_xplan之display_cursor函数的使用的更多相关文章

  1. dbms_xplan的display_cursor查看执行计划

    准备工作: SQL> conn sys/root as sysdba Connected. SQL> grant select on v_$sql_plan to scott; Grant ...

  2. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  3. Oracle SQL tuning 步骤

    Oracle SQL tuning 步骤 SQL是的全称是Structured Query Language(结构化查询语言).SQL是一个在80年代中期被使用的工业标准数据库查询语言.不要把SQL语 ...

  4. VirtualBox 扩展包卸载或安装失败(VERR_ALREADY_EXISTS)

    最近在卸载VirtualBox出现了无法卸载的错误.提示为Failed to install the extension. The installer failed with exit code 1: ...

  5. RAC环境下的堵塞(blocking blocked)

    RAC环境下的堵塞不同于单实例情形,由于我们须要考虑到位于不同实例的session.也就是说之前查询的v$session,v$lock对应的应变化为全局范围来查找.本文提供了2个查询脚本,并给出实例演 ...

  6. Oracle 堵塞(blocking blocked)

    堵塞是DBA常常碰到的情形,尤其是不良的应用程序设计的堵塞将导致性能严重下降直至数据库崩溃. 对DBA而言,有必要知道怎样定位到当前系统有哪些堵塞,究竟谁是堵塞者,谁是被堵塞者.本文对此给出了描写叙述 ...

  7. 通过dbms_xplan.display_cursor识别低效的执行计划

    dbms_xplan.display_cursor定义: function display_cursor(sql_id           varchar2 default  null,        ...

  8. dbms_xplan的display查看执行计划

    DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用 display函数,而实际的执行计划则是用display_curs ...

  9. 查看ORACLE的实际执行计划

    ORACLE的执行计划分为预估执行计划和实际执行计划.其中,你用Toad.PL/SQL Developer.SQL Developer.EXPLAIN PLAN FOR或者SET ATUOTRACE ...

随机推荐

  1. stdlib.h

    stdlib 头文件即standard library标准库头文件.stdlib.h里面定义了五种类型.一些宏和通用工具函数. 1 类型例如size_t.wchar_t.div_t.ldiv_t和ll ...

  2. MVC 模型 视图, 控制器 写 三级联动

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. windows dos命令

    dos命令配置环境变量: path=%path%;D:\Installed software\Professional software\Python27   (https://www.cnblogs ...

  4. ElasticSearch 5.0 简介

    参考:http://blog.csdn.net/wzhg0508/article/details/52063676 Elasticsearch 5.0 简介(medcl微信直播实录) 大家好,非常高兴 ...

  5. Understanding Safari Reader

    Interesting enough to find out the Reader function in Safari is actually Javascript and there are ma ...

  6. GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-

    今天更新为163的源后,yum的时候报错:GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gp ...

  7. WebApi_基于Token的身份验证——JWT

    JWT是啥? JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为: A.B.C A由JWT头部信息header加密得到B由JWT用到的身份验证信息json数据加密得到C由A和B加密得到,是校 ...

  8. opencart安装和使用PHPMailer

    一.安装PHPMailer 1)先给opencart项目安装vqmod 下载最新版本: http://code.google.com/p/vqmod (目前最新版本是vqmod-2.5.1-stand ...

  9. PythonWeb开发教程(一),开发之前需要准备什么

    什么是web开发呢,其实就是开发一个网站了.那开发网站需要用到哪些知识呢 1.python基础,因为用python开发的,所以python指定要会,最起码你也得会条件判断,循环,函数,类这些知识: 2 ...

  10. MessageRPC

    项目地址 :  https://github.com/kelin-xycs/MessageRPC MessageRPC 一个 用 C# 实现的 使用 Message 的 RPC MessageRPC ...