千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"oracle中查看执行计划的常用方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本
千家信息网最后更新 2026年11月01日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安全错误 数据库的锁怎样保障安全 哈尔滨大商圈互联网科技有限公司 A股互联网金融科技公司 互联网与科技金融数据 互联网公司 科技公司 奇酷互联网科技 互联网未来科技 杭州互联网科技公司 米客互联网科技 互联网科技咨询 互联网和高科技公司 农村开互联网科技讲堂 未来五年的互联网科技 滨湖区互联网智能科技产品有哪些 美国互联网科技公司 南京一网一红互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 上海同邻互联网科技有限公司规模 西安有哪些互联网高科技企业 互联网科技创新创业项目 安徽九吞吴互联网科技有限公司 互联网科技巨头监管 互联网最新的科技 互联网巨头反垄断金融科技 腾讯阿里互联网科技 中资互联网科技 互联网科技教育视频 栖莱科技互联网股份有限公司 世界互联网领先科技成果获奖 南博望互联网科技有限公司 科技互联网专业工作会议发言稿
0