千家信息网

oracle中查看执行计划的常用方法

发表于:2024-10-27 作者:千家信息网编辑
千家信息网最后更新 2024年10月27日,本篇内容介绍了"oracle中查看执行计划的常用方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本
千家信息网最后更新 2024年10月27日oracle中查看执行计划的常用方法

本篇内容介绍了"oracle中查看执行计划的常用方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!


本文介绍了oracle中查看执行计划常用的方法。
1、EXPLAIN PLAN命令
2、AUTOTRACE开关
3、DBMS_XPLAN
4、10046事件

1、EXPLAIN PLAN命令

  1. SQL> var a number;

  2. SQL> var b number;

  3. SQL> exec :a :=0;


  4. PL/SQL procedure successfully completed.


  5. SQL> exec :b :=70000;


  6. PL/SQL procedure successfully completed.

  7. SQL> explain plan for select count(*) from t where object_id between :a and :b;


  8. Explained.


  9. SQL> select * from table(dbms_xplan.display);


  10. PLAN_TABLE_OUTPUT

  11. --------------------------------------------------------------------------------

  12. Plan hash value: 2213771543


  13. ----------------------------------------------------------------------------

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

  15. ----------------------------------------------------------------------------

  16. | 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:00:01 |

  17. | 1 | SORT AGGREGATE | | 1 | 5 | | |

  18. |* 2 | FILTER | | | | | |

  19. |* 3 | INDEX RANGE SCAN| T_IDX | 180 | 900 | 2 (0)| 00:00:01 |

  20. ----------------------------------------------------------------------------

  21. 。。。。省略部分

  1. SQL> set autot traceonly

  2. SQL> select count(*) from t where object_id between :a and :b;

  3. Execution Plan

  4. ----------------------------------------------------------

  5. Plan hash value: 2213771543


  6. ----------------------------------------------------------------------------

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

  8. ----------------------------------------------------------------------------

  9. | 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:00:01 |

  10. | 1 | SORT AGGREGATE | | 1 | 5 | | |

  11. |* 2 | FILTER | | | | | |

  12. |* 3 | INDEX RANGE SCAN| T_IDX | 180 | 900 | 2 (0)| 00:00:01 |

  13. 。。。省略部分

  1. SQL> select count(*) from t where object_id between :a and :b;


  2. COUNT(*)

  3. ----------

  4. 136544


  5. SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));


  6. PLAN_TABLE_OUTPUT

  7. --------------------------------------------------------------------------------

  8. SQL_ID 9cgwqzzvtw8wc, child number 0

  9. -------------------------------------

  10. select count(*) from t where object_id between :a and :b


  11. Plan hash value: 853742775


  12. --------------------------------------------------------------------------------

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

  14. --------------------------------------------------------------------------------

  15. | 0 | SELECT STATEMENT | | | | 45 (100)| |

  16. | 1 | SORT AGGREGATE | | 1 | 5 | | |


  17. PLAN_TABLE_OUTPUT

  18. --------------------------------------------------------------------------------

  19. |* 2 | FILTER | | | | | |

  20. |* 3 | INDEX FAST FULL SCAN| T_IDX | 50561 | 246K| 45 (0)| 00:00:01 |

。。。省略部分


==》真实的执行计划应该是INDEX FAST FULL SCAN

3、DBMS_XPLAN

DBMS_XPLANB包的常用子程序为:

DISPLAY:配合explain plan for 使用

DISPLAY_CURSOR:适用于sqlplus刚刚执行过的sql执行计划,或在存储在shared pool中的执行计划。

DISPLAY_AWR:sql的执行计划从shared pool中aga out后,如果执行计划被采集到awr报告中,那么就可以使用该方法查看执行计划。

示例:

  1. SQL> select status from t where owner=user;

  2. VALID

  3. VALID

  4. VALID

  5. 。。。省略部分


  6. 31206 rows selected.


  7. SQL> select * from table(dbms_xplan.display_cursor(null,null,'advanced'));


  8. PLAN_TABLE_OUTPUT

  9. -----------------------------------------------------------------------------------------

  10. SQL_ID 7m7b6un3xtss3, child number 0

  11. -------------------------------------

  12. select status from t where owner=user


  13. Plan hash value: 47527108


  14. ------------------------------------------------------------------------------------------

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

  16. ------------------------------------------------------------------------------------------

  17. | 0 | SELECT STATEMENT | | | | 13 (100)| |

  18. | 1 | TABLE ACCESS BY INDEX ROWID| T | 2255 | 27060 | 13 (0)| 00:00:01 |

  19. |* 2 | INDEX RANGE SCAN | DESC_T_INX | 70 | | 10 (0)| 00:00:01 |

  20. ------------------------------------------------------------------------------------------


  21. Query Block Name / Object Alias (identified by operation id):

  22. -------------------------------------------------------------


  23. 1 - SEL$1 / T@SEL$1

  24. 2 - SEL$1 / T@SEL$1


  25. Outline Data

  26. -------------


  27. /*+

  28. BEGIN_OUTLINE_DATA

  29. IGNORE_OPTIM_EMBEDDED_HINTS

  30. OPTIMIZER_FEATURES_ENABLE('11.2.0.1')

  31. DB_VERSION('11.2.0.1')

  32. ALL_ROWS

  33. OUTLINE_LEAF(@"SEL$1")

  34. INDEX_RS_ASC(@"SEL$1" "T"@"SEL$1" "DESC_T_INX")

  35. END_OUTLINE_DATA

  36. */


  37. Predicate Information (identified by operation id):

  38. ---------------------------------------------------


  39. 2 - access("T"."SYS_NC00016$"=SYS_OP_DESCEND(USER@!))

  40. filter(SYS_OP_UNDESCEND("T"."SYS_NC00016$")=USER@!)


  41. Column Projection Information (identified by operation id):

  42. -----------------------------------------------------------


  43. 1 - "STATUS"[VARCHAR2,7]

  44. 2 - "T".ROWID[ROWID,10], "T"."SYS_NC00016$"[RAW,46]


  45. 46 rows selected.

==>1.相比AUTOTRACE开关来说看不到相关的统计信息,而且要等到语句执行完成。但获得的执行计划是真实的

2.这里format参数为advanced,相比较于参数all,多了Outline Data这部分的信息输出

3.这里的Rows列值为估计值,要想看到真实值可以将format参数设置为'ALLSTATS LAST'

format参数设置为'ALLSTATS LAST'示例:

  1. SQL> alter session set statistics_level =all;


  2. Session altered.


  3. SQL> select status from t where owner=user;

  4. VALID

  5. VALID

  6. VALID

  7. 。。。。。省略部分


  8. 31206 rows selected.


  9. SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));


  10. PLAN_TABLE_OUTPUT

  11. --------------------------------------------------------------------------------------------------------------

  12. SQL_ID 7m7b6un3xtss3, child number 1

  13. -------------------------------------

  14. select status from t where owner=user


  15. Plan hash value: 47527108


  16. -------------------------------------------------------------------------------------------------------------

  17. | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |

  18. -------------------------------------------------------------------------------------------------------------

  19. | 0 | SELECT STATEMENT | | 1 | | 31206 |00:00:00.05 | 5555 | 829 |

  20. | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 2255 | 31206 |00:00:00.05 | 5555 | 829 |

  21. |* 2 | INDEX RANGE SCAN | DESC_T_INX | 1 | 70 | 31206 |00:00:00.02 | 2190 | 114 |

  22. -------------------------------------------------------------------------------------------------------------


  23. Predicate Information (identified by operation id):

  24. ---------------------------------------------------


  25. 2 - access("T"."SYS_NC00016$"=SYS_OP_DESCEND(USER@!))

  26. filter(SYS_OP_UNDESCEND("T"."SYS_NC00016$")=USER@!)

==》和advanced参数相比,少了部分输出,但是能够看到每一步获取的实际记录数。

输入sqlid来查看执行计划示例:

  1. SQL> select sql_text,sql_id,version_count,executions from v$sqlarea where sql_text like 'select status from t where owner=user';


  2. SQL_TEXT SQL_ID VERSION_COUNT EXECUTIONS

  3. ---------------------------------------- ------------- ------------- ----------

  4. select status from t where owner=user 7m7b6un3xtss3 2 3


  5. SQL> select * from table(dbms_xplan.display_cursor('7m7b6un3xtss3',0,'advanced'));


  6. PLAN_TABLE_OUTPUT

  7. --------------------------------------------------------------------------------

  8. SQL_ID 7m7b6un3xtss3, child number 0

  9. -------------------------------------

  10. select status from t where owner=user


  11. Plan hash value: 47527108


  12. ------------------------------------------------------------------------------------------

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

  14. ------------------------------------------------------------------------------------------

  15. | 0 | SELECT STATEMENT | | | | 13 (100)| |

  16. | 1 | TABLE ACCESS BY INDEX ROWID| T | 2255 | 27060 | 13 (0)| 00:00:01 |

  17. |* 2 | INDEX RANGE SCAN | DESC_T_INX | 70 | | 10 (0)| 00:00:01 |

  18. ------------------------------------------------------------------------------------------


  19. Query Block Name / Object Alias (identified by operation id):

  20. -------------------------------------------------------------


  21. 1 - SEL$1 / T@SEL$1

  22. 2 - SEL$1 / T@SEL$1


  23. Outline Data

  24. -------------


  25. /*+

  26. BEGIN_OUTLINE_DATA

  27. IGNORE_OPTIM_EMBEDDED_HINTS

  28. OPTIMIZER_FEATURES_ENABLE('11.2.0.1')

  29. DB_VERSION('11.2.0.1')

  30. ALL_ROWS

  31. OUTLINE_LEAF(@"SEL$1")

  32. INDEX_RS_ASC(@"SEL$1" "T"@"SEL$1" "DESC_T_INX")

  33. END_OUTLINE_DATA

  34. */


  35. Predicate Information (identified by operation id):

  36. ---------------------------------------------------


  37. 2 - access("T"."SYS_NC00016$"=SYS_OP_DESCEND(USER@!))

  38. filter(SYS_OP_UNDESCEND("T"."SYS_NC00016$")=USER@!)


  39. Column Projection Information (identified by operation id):

  40. -----------------------------------------------------------


  41. 1 - "STATUS"[VARCHAR2,7]

  42. 2 - "T".ROWID[ROWID,10], "T"."SYS_NC00016$"[RAW,46]

display_awr 示例:

  1. SQL> select sql_text,sql_id,version_count,executions from v$sqlarea where sql_text like 'select status from t where owner=user';


  2. no rows selected


  3. SQL> select * from table(dbms_xplan.display_cursor('7m7b6un3xtss3',0,'advanced'));


  4. PLAN_TABLE_OUTPUT

  5. -------------------------------------------------------------------------

  6. SQL_ID: 7m7b6un3xtss3, child number: 0 cannot be found



  7. SQL> select * from table(dbms_xplan.display_awr('7m7b6un3xtss3'));


  8. PLAN_TABLE_OUTPUT

  9. -------------------------------------------------------------------------

  10. SQL_ID 7m7b6un3xtss3

  11. --------------------

  12. select status from t where owner=user


  13. Plan hash value: 47527108


  14. --------------------------------------------------------------------------

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

  16. --------------------------------------------------------------------------

  17. | 0 | SELECT STATEMENT | | | | 13 (100)| |

  18. | 1 | TABLE ACCESS BY INDEX ROWID| T | 2255 | 27060 | 13 (0)| 00:00:01 |

  19. | 2 | INDEX RANGE SCAN | DESC_T_INX | 70 | | 10 (0)| 00:00:01 |


==>1、相同的执行计划也可以通过@?/rdbms/admin/awrsqrpt 命令获取。

4、10046方式

  1. SQL> alter session set tracefile_identifier=plan_10046;


  2. Session altered.


  3. SQL> alter session set events '10046 trace name context forever,level 12';


  4. Session altered.


  5. SQL> select status from t where owner=user;

  6. VALID

  7. VALID

  8. VALID

  9. 。。。省略部分


  10. 31206 rows selected.


  11. SQL>

  12. SQL> alter session set events '10046 trace name context off';


  13. Session altered.

==>可以根据diagnostic_dest 参数找到plan_10046的文件。

使用tkprof进行输出:

  1. [ora11@ora12c ~]$ tkprof /ora11_10/ora11/diag/rdbms/ora11/ora11/trace/ora11_ora_26758_PLAN_10046.trc PLAN_10046.trc


  2. TKPROF: Release 11.2.0.1.0 - Development on Tue Aug 15 21:14:49 2017


  3. Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.



  4. SQL ID: 57fcnar0x2buq

  5. Plan Hash: 47527108

  6. select status

  7. from

  8. t where owner=user


  9. call count cpu elapsed disk query current rows

  10. ------- ------ -------- ---------- ---------- ---------- ---------- ----------

  11. Parse 1 0.00 0.00 11 57 0 0

  12. Execute 1 0.00 0.00 0 0 0 0

  13. Fetch 2082 0.13 0.13 1007 5555 0 31206

  14. ------- ------ -------- ---------- ---------- ---------- ---------- ----------

  15. total 2084 0.14 0.13 1018 5612 0 31206


  16. Misses in library cache during parse: 1

  17. Optimizer mode: ALL_ROWS

  18. Parsing user id: SYS


  19. Rows Row Source Operation

  20. ------- ---------------------------------------------------

  21. 31206 TABLE ACCESS BY INDEX ROWID T (cr=5555 pr=1007 pw=0 time=76792 us cost=13 size=27060 card=2255)

  22. 31206 INDEX RANGE SCAN DESC_T_INX (cr=2190 pr=114 pw=0 time=29158 us cost=10 size=0 card=70)(object id 99885)

"oracle中查看执行计划的常用方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

部分 参数 常用 方法 示例 输出 命令 信息 内容 实际 更多 知识 实用 相同 学有所成 接下来 事件 估计值 可以通过 困境 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全编程工程师认证 河南科技大学互联网加 标注软件开发 信息网络安全与两化融合 电脑服务器开通网站 网络安全宣传周活动主题心得 服务器t620装系统找不到硬盘 怎样创建数据库xsgl 如果你想在vac安全服务器 软件开发专业逻辑思维 哪个不是网络安全具有的特征 如何防止服务器被入侵 信息网络技术今后能做什么 好玩的mc小游戏服务器 全云互联网科技有限公啊 windows10挂载服务器 网络技术应用参考答案 2020年网络安全周相关知识 网络安全在我心主题演讲 提示微信数据库有损坏怎么回事 企业用户数据库 惠普服务器硬盘管理软件 租用海外服务器 一网络安全为主题画一幅手抄报 漂亮网络安全手抄报 outlook服务器请求 内蒙古网络安全等级保护 虚拟机如何防止被服务器检测 检索中文期刊论文用哪几个数据库 给服务器安装2012操作系统
0