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

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的操作),该值默认为空

示例:

[html]  view plain copy
  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.  

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输出格式

  

示例:

[html]  view plain copy
  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%';  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谭祖爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值