Oracle 执行计划的获取-1

来源:互联网 发布:凯立德v5配置端口修改 编辑:程序博客网 时间:2024/05/17 21:48

     在很多时候,我们查看SQL的性能,就要用到执行计划。获取执行计划的方法在Oracle里面大概也就6种吧!

          1. explain plan for获取; 2. set autotrace on ;      3. statistics_level=all;
          4. 10046 trace跟踪          5. awrsqrpt.sql

          6. 通过dbms_xplan.display_cursor输入sql_id参数直接获取 

          不知道大家有没有想过这个几种的区别呢,今天我们就想讨论下前面3种的区别。

     第一种:explain plan for 的方式,PLSQL DEVELOPE里的F5和这个很像

           

           优点:不用执行SQL,速度快。

           不足:1.没有输出运行时的相关统计信息(产生多少逻辑读,多少次递归调用,多少次物理读的情况);
                      2.无法判断是处理了多少行;
                      3.无法判断表被访问了多少次。


     第二种: set autotrace on 

         set autotrace on                         (得到执行计划,输出运行结果)
         set autotrace traceonly              (得到执行计划,不输出运行结果)
         set autotrace traceonly explain  (得到执行计划,不输出运行结果和统计信息部分,仅展现执行计划部分)
         set autotrace traceonl statistics (不输出运行结果和执行计划部分,仅展现统计信息部分)

         

         优点:1.可以输出运行时的相关统计信息

                    2.可以控制显示的项目

         不足:1.必须要等到语句真正执行完毕后,才可以出结果(待确认)。

                    2.没有表访问次数的统计

       1、DB Block Gets(当前请求的块数目)当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读 的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。 
       2、Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操 作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。 
       3、Physical Reads(物理读)就是从磁盘上读取数据块的数量,其产生的主要原因是: 1、 在数据库高速缓存中不存在这些块 2、 全表扫描 3、 磁盘排序 
      它们三者之间的关系大致可概括为:逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsical reads'。(摘自:http://www.itpub.net/thread-914103-1-1.html)

   第三种:statistics level=all

     

    优点:1.可以清晰的从STARTS得出表被访问多少。
               2.可以清晰的从E-ROWS和A-ROWS中得到预测的行数和真实的行数,从而可以准确判断Oracle评估是否准                   确。
               3.虽然没有专门的输出运行时的相关统计信息,但是执行计划中的BUFFERS就是真实的逻辑读的多少
                 
    不足:1.必须要等到语句真正执行完毕后,才可以出结果。
               2.无法控制记录输屏打出,不像autotrace有 traceonly 可以控制不将结果打屏输出。
               3.看不出递归调用的次数,看不出物理读的多少(不过逻辑读才是重点)

    Starts为该sql执行的次数。
    E-Rows为执行计划预计的行数。
    A-Rows为实际返回的行数。A-Rows跟E-Rows做比较,就可以确定哪一步执行计划出了问题。
    A-Time为每一步实际执行的时间(HH:MM:SS.FF),根据这一行可以知道该sql耗时在了哪个地方。
    Buffers为每一步实际执行的逻辑读或一致性读。
    Reads为物理读。
   

     上面的3中用法,都是有各自的不足的,大家在SQL优化的时候,要注意。

      alter session set statistics_level=all ;

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


      set linesize 1000
      set pagesize 2000
      explain plan for 你的SQL
      select * from table(dbms_xplan.display());

      

0 0
原创粉丝点击