zoukankan      html  css  js  c++  java
  • Oracle 生成和显示执行计划的方法

    Oracle 生成和显示执行计划的方法

    分类: Oracle 执行计划 264人阅读 评论(0) 收藏 举报

    Oracle 生成和显示执行计划的方法

    生成执行计划

    一条合法的语句在执行之后,就会在内存中至少产生一条执行计划,可以从视图v$sql_plan查询。每一条执行计划对于一个游标。一条语句生产的第一个游标的CHILD_NUMBER(即v$sql_plan中的CHILD_NUMBER)为0,同一条sql语句可能因为环境或版本等其他因素不同而产生不同的执行计划,也就是说一条sql可能有多个CHILD_NUMBER

    除执行过的sql会在内存中生成执行计划外,还可以通过explain plan让优化器对sql语句进行解析,生成查询计划。执行explain plan命令后,oracle会将解释生成的执行计划插入sys.plan_table$(10g之前,表名为plan_table;10g之后,通过公共同义词plan_table指向sys.plan_table$)中。explain plan产生的执行计划不会在语句执行时重用,而是以类似explain plan for<SQL>的形式在缓存中。

    显示执行计划

     通过DBMS_XPLAN包显示执行计划(推荐)

    DBMS_XPLAN含有5个函数用于输出格式化的执行计划,如下:

    display:显示explain plan命令解释的执行计划

    display_cursor:显示内存中的执行计划

    display_awr:awr历史数据中的执行计划

    display_sqlset:SQL优化集中语句的执行计划

    display_sql_plan_baseline:SQL执行计划基线

    display的用法

    语法:

    DBMS_XPLAN.DISPLAY(
       table_name    IN  VARCHAR2  DEFAULT 'PLAN_TABLE',
       statement_id  IN  VARCHAR2  DEFAULT  NULL, 
       format        IN  VARCHAR2  DEFAULT  'TYPICAL',
       filter_preds  IN  VARCHAR2 DEFAULT NULL);
    参数:
    ParameterDescription

    table_name

    存储查询计划的表名,默认值为PLAN_TABLE

    statement_id

    要显示查询计划的SQL语句的ID,如果为空,就会获取最近一条被解释的语句

    format

    输出格式,有以下几种预定义的格式可选择,还可以自定义(这里不多说):

    • BASIC:基本格式,内容最少.

    • TYPICAL: 典型格式,通常够用,默认格式

    • SERIAL: 串行执行格式,这种格式和典型格式输出内容基本一致,只是对于并行查询,不会输出相关的并行内容

    • ALL: 完全格式,输出内容相对完整

    filter_preds

    该参数用谓词条件过滤存储执行计划的表,例如'plan_id = 10或cost>100(显示估算代价大于100的操作),该值默认为空


    示例:

    1. 用explain plan执行sql语句:  
    2.   
    3. EXPLAIN PLAN FOR  
    4. SELECT * FROM emp e, dept d  
    5.    WHERE e.deptno = d.deptno  
    6.    AND e.ename='benoit';  
    7. Display the plan using the DBMS_XPLAN.DISPLAY table function  
    8.   
    9. SET LINESIZE 130  
    10. SET PAGESIZE 0  
    11. SELECT * FROM table(DBMS_XPLAN.DISPLAY);  
    12. 输出结果如下  
    13.   
    14. Plan hash value: 3693697075  
    15. ---------------------------------------------------------------------------  
    16. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
    17. ---------------------------------------------------------------------------  
    18. |   0 | SELECT STATEMENT   |      |     1 |    57 |     6  (34)| 00:00:01 |  
    19. |*  1 |  HASH JOIN         |      |     1 |    57 |     6  (34)| 00:00:01 |  
    20. |*  2 |   TABLE ACCESS FULL| EMP  |     1 |    37 |     3  (34)| 00:00:01 |  
    21. |   3 |   TABLE ACCESS FULL| DEPT |     4 |    80 |     3  (34)| 00:00:01 |  
    22. ---------------------------------------------------------------------------  
    23.   
    24. Predicate Information (identified by operation id):  
    25. ---------------------------------------------------  
    26.    1 - access("E"."DEPTNO"="D"."DEPTNO")  
    27.    2 - filter("E"."ENAME"='benoit')  
    28.   
    29. 15 rows selected.  
    用explain plan执行sql语句:
    
    EXPLAIN PLAN FOR
    SELECT * FROM emp e, dept d
       WHERE e.deptno = d.deptno
       AND e.ename='benoit';
    Display the plan using the DBMS_XPLAN.DISPLAY table function
    
    SET LINESIZE 130
    SET PAGESIZE 0
    SELECT * FROM table(DBMS_XPLAN.DISPLAY);
    输出结果如下
    
    Plan hash value: 3693697075
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     1 |    57 |     6  (34)| 00:00:01 |
    |*  1 |  HASH JOIN         |      |     1 |    57 |     6  (34)| 00:00:01 |
    |*  2 |   TABLE ACCESS FULL| EMP  |     1 |    37 |     3  (34)| 00:00:01 |
    |   3 |   TABLE ACCESS FULL| DEPT |     4 |    80 |     3  (34)| 00:00:01 |
    ---------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - access("E"."DEPTNO"="D"."DEPTNO")
       2 - filter("E"."ENAME"='benoit')
    
    15 rows selected.

    display_cursor的用法

    display_cursor可以显示内存中一个或多个游标的执行计划.

    语法:

    DBMS_XPLAN.DISPLAY_CURSOR(
       sql_id        IN  VARCHAR2  DEFAULT  NULL,
       child_number  IN  NUMBER    DEFAULT  NULL, 
       format        IN  VARCHAR2  DEFAULT  'TYPICAL');
    参数:
    ParameterDescription

    sql_id

    要显示执行计划的sql语句的ID

    child_number

    子游标序号

    format

    输出格式

    同于display输出格式

       


    示例:

    1. <SPAN style="COLOR: #009900">display_cursor 默认是获得由本session执行的之后一条语句的执行计划:</SPAN>  
    2.   
    3. SELECT ename  FROM  emp e, dept d   
    4.    WHERE   e.deptno = d.deptno    
    5.    AND   e.empno=7369;  
    6.   
    7. ENAME  
    8. ----------  
    9. SMITH  
    10.   
    11. SET PAGESIZE 0  
    12. SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR);  
    13. <SPAN style="COLOR: #009900">输出结果如下:</SPAN>  
    14. Plan hash value: 3693697075, SQL hash value: 2096952573, child number: 0  
    15. ------------------------------------------------------------------  
    16. SELECT ename FROM emp e, dept d WHERE e.deptno = d.deptno  
    17. AND e.empno=7369  
    18.   
    19. ---------------------------------------------------------------------------  
    20. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
    21. ---------------------------------------------------------------------------  
    22. |   0 | SELECT STATEMENT   |      |       |       |            |          |  
    23. |*  1 |  HASH JOIN         |      |     1 |    16 |     6  (34)| 00:00:01 |  
    24. |*  2 |   TABLE ACCESS FULL| EMP  |     1 |    13 |     3  (34)| 00:00:01 |  
    25. |   3 |   TABLE ACCESS FULL| DEPT |     4 |    12 |     3  (34)| 00:00:01 |  
    26. ---------------------------------------------------------------------------  
    27.   
    28. Predicate Information (identified by operation id):  
    29. ---------------------------------------------------  
    30.    1 - access("E"."DEPTNO"="D"."DEPTNO")  
    31.    2 - filter("E"."EMPNO"=7369)  
    32.   
    33. 21 rows selected.  
    34.   
    35.   
    36. <SPAN style="COLOR: #009900">还可以用下面的方式获得SQL_ID和CHILD_NUMBER</SPAN>  
    37.   
    38. SELECT /* TOTO */ ename, dname   
    39. FROM dept d join emp e USING (deptno);  
    40.   
    41. <SPAN style="COLOR: #009900">用上面的语句得到 sql_id和child_number:</SPAN>  
    42.   
    43. SELECT sql_id, child_number  
    44. FROM v$sql   
    45. WHERE sql_text LIKE '%TOTO%';  
    46.   
    47. SQL_ID         CHILD_NUMBER  
    48. ----------     -----------------------------  
    49. gwp663cqh5qbf   0  
    50.   
    51.   
    52. SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR(('gwp663cqh5qbf',0));  
    53.   
    54. Plan hash value: 3693697075, SQL ID: gwp663cqh5qbf, child number: 0  
    55. --------------------------------------------------------  
    56. SELECT /* TOTO */ ename, dname   
    57. FROM dept d JOIN emp e USING (deptno);  
    58.   
    59. ----------------------------------------------------------------------------  
    60. | Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |  
    61. ----------------------------------------------------------------------------  
    62. |   0 | SELECT STATEMENT    |      |       |       |     7 (100)|          |  
    63. |   1 |  SORT GROUP BY      |      |     4 |    64 |     7  (43)| 00:00:01 |  
    64. |*  2 |   HASH JOIN         |      |    14 |   224 |     6  (34)| 00:00:01 |  
    65. |   3 |    TABLE ACCESS FULL| DEPT |     4 |    44 |     3  (34)| 00:00:01 |  
    66. |   4 |    TABLE ACCESS FULL| EMP  |    14 |    70 |     3  (34)| 00:00:01 |  
    67. ----------------------------------------------------------------------------  
    68.   
    69. Predicate Information (identified by operation id):  
    70. ---------------------------------------------------  
    71.    2 - access("E"."DEPTNO"="D"."DEPTNO")  
    72.   
    73. <SPAN style="COLOR: #009900">上边的两步还可以用下面的方法一次性得到</SPAN>  
    74. SELECT t.*  
    75. FROM v$sql s, table(DBMS_XPLAN.DISPLAY_CURSOR(s.sql_id, s.child_number)) t WHERE sql_text LIKE '%TOTO%';  
  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/weixun/p/3274971.html
Copyright © 2011-2022 走看看