Oracle10中如何用dbms_xplan分析执行计划

Oracle CBO中选择执行计划,有时候不是最优执行计划,造成该原因通俗讲是因为CBO计算出来的处理行数量,与实际处理行的数量相差很大。在9i中,两者的值需要分别从v$sql_plan.cardinality和v$sql_plan_statistics.last_output_rows提取,或者通过tkprof分析10046输出rows。 10g中引入了dbms_xplan.display_cursor很好地解决了这个问题。

       案例:
             SQL>select /*+ gather_plan_statistics */  distinct owner
                       from v$access
           
                Elapsed: 00:03:22.45
           
              说明:gather_plan_statistics主要是收集语句执行的时候,行的统计信息。

       分析:

           SQL> select * from table(dbms_xplan.display_cursor(
                       '6ht2q648nq5xa', '0', 'ALL ALLSTATS'));

           说明:dbms_xplan.display_cursor( sql_id, cursor_child_no, format)中
                        format表达式
                             IOSTATS: IO统计
                             MEMSTATS: 使用的PGA统计
                             ALLSTATS: IOSTATS+MEMSTATS
                             LAST: 游标中最后执行
                             ALL: 输出中显示Query block/Object Alias、Predicate 信息和         
                                       Column Projection 信息;
                             Advanced: ALL + Outline信息;
                             Outline: 输出显示Outline 信息和Predicate信息;

           输出执行计划:                 
---------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name            | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   |  OMem |  1Mem |  O/1/M   |
---------------------------------------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH UNIQUE               |                 |      1 |    105 | 14175 |     1 (100)| 00:00:01 |      3 |00:00:27.72 |       |       |          |
|   2 |   NESTED LOOPS             |                 |      1 |    105 | 14175 |     0   (0)|          |    108 |00:00:23.35 |       |       |          |
|   3 |    NESTED LOOPS            |                 |      1 |     10 |   820 |     0   (0)|          |    108 |00:00:23.34 |       |       |          |
|   4 |     MERGE JOIN CARTESIAN   |                 |      1 |    100 |  5700 |     0   (0)|          |  24650 |00:00:00.11 |       |       |          |
|*  5 |      FIXED TABLE FULL      | X$KSUSE         |      1 |      1 |    19 |     0   (0)|          |    170 |00:00:00.01 |       |       |          |
|   6 |      BUFFER SORT           |                 |   170|   100|  3800 |     0   (0)|          | 24650|00:00:00.06 | 18432 | 18432 |     1/0/0|
|   7 |       FIXED TABLE FULL     | X$KGLDP         |      1 |    100 |  3800 |     0   (0)|          |    145 |00:00:00.01 |       |       |          |
|*  8 |     FIXED TABLE FIXED INDEX| X$KGLLK (ind:1) |  24650 |      1 |    25 |     0   (0)|          |    108 |00:00:27.60 |       |       |          |
|*  9 |    FIXED TABLE FIXED INDEX | X$KGLOB (ind:1) |    108 |     10 |   530 |     0   (0)|          |    108 |00:00:00.01 |       |       |          |
---------------------------------------------------------------------------------------------------------------------------------------------------------


           说明:
             1、E-ROWs: 执行计划中所预测的行处理数,与explain plan for中rows的数
                                      量相同;

             2、A-ROWS:实际处理的行数量与10046中rows source operation值相同

             3、0Mem: 与v$sql_worarea.ESTIMATED_OPTIMAL_SIZE值相同

              4、1Mem:与v$sql_worarea.ESTIMATED_ONEPASS_SIZE值相同
           
             分析结果:
                    我们看到buffer sort中 E-ROWs=100,A-ROWS=24650,如果这两个比
            值超过100以上就说明CBO采用的统计分析计算和实际相差很大,有可能是
            统计分析不对,或者是统计分析正确,但采用的模型计算与实际情况相差比
            较大。
                    本案例中是因为fixed table没有进行统计分析,具体处理步骤见前一篇博
            客。

     处理后结果:
         
            SQL> set serveroutput off
            SQL> SElect /*+ gather_plan_statistics */ distinct owner from v$access;
 
               Elapsed: 00:00:00.07
           
             SQL> select * from table(
                        dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name            | Starts | E-Rows | A-Rows |   A-Time   |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH UNIQUE               |                 |      1 |      4 |      3 |00:00:00.06 |       |       |          |
|   2 |   HASH JOIN                |                 |      1 |    403 |    495 |00:00:00.06 |  1236K|  1236K| 1474K (0)|
|   3 |    FIXED TABLE FULL        | X$KSUSE         |      1 |    170 |    170 |00:00:00.01 |       |       |          |
|   4 |    NESTED LOOPS            |                 |      1 |    403 |    495 |00:00:00.05 |       |       |          |
|   5 |     HASH JOIN              |                 |      1 |    403 |    495 |00:00:00.03 |   963K|   963K| 1258K (0)|
|   6 |      FIXED TABLE FULL      | X$KGLLK         |      1 |    403 |    407 |00:00:00.01 |       |       |          |
|   7 |      FIXED TABLE FULL      | X$KGLDP         |      1 |    567 |   1390 |00:00:00.02 |       |       |          |
|   8 |     FIXED TABLE FIXED INDEX| X$KGLOB (ind:1) |    495 |      1 |    495 |00:00:00.01 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------
                                                           

              从输出结果中没有出现(A-ROWS/ E-ROWs)>100             
from: http://space.itpub.net/354732/viewspace-606354
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值