zoukankan      html  css  js  c++  java
  • oracle 执行计划 plan autotrace

    http://lzfhope.blog.163.com/blog/static/63639922008271139360/?suggestedreading&wumii

    整理ORACLE中查看执行计划plan  

    2008-03-07 11:39:36|  分类: ORACLE管理 |  标签:sql*plus  执行计划  oracle  性能   |字号 订阅

     
     

           能执行并看查看sql的执行计划应该是PL/SQL开发人员的基本功。
           必须声明,以下是基于oracle10g的,对8i及其更早的版本不再讨论。
           一:执行形式
           通常我们在sql*plus中就可以执行了。在形式上,如果按照输出结果方式主要有两个不同,按照执行方式也有两个不同。
          至于第三方,目前暂时不讨论,其它的,它们也是通过调用oracle函数实现的。
           至于如何使用dbms_xplan包裹,不在此详述,我自己一般也不用。
           1)执行方式1 --  set autotrace traceonly..
           sql>set serveroutput on
           sql>set autotrace traceonly 
           完整格式是:
           SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
           然后运行即可直接的查看结果,如例子(已经手工删除一些空白):
            SQL> select * from tab;      
            已选择442行。              
            执行计划
            ----------------------------------------------------------                     
            Plan hash value: 457676135                                                                                                                                            
            --------------------------------------------------------------------------------
            | Id  | Operation             | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
            --------------------------------------------------------------------------------
            |   0 | SELECT STATEMENT      |        |  1066 | 90610 |   204   (4)| 00:00:03 |
            |   1 |  NESTED LOOPS OUTER   |        |  1066 | 90610 |   204   (4)| 00:00:03 |
            |*  2 |   TABLE ACCESS FULL   | OBJ$   |  1066 | 83148 |   152   (5)| 00:00:02 |
            |   3 |   TABLE ACCESS CLUSTER| TAB$   |     1 |     7 |     1   (0)| 00:00:01 |
            |*  4 |    INDEX UNIQUE SCAN  | I_OBJ# |     1 |       |     0   (0)| 00:00:01 |
            --------------------------------------------------------------------------------                                                                                      
            Predicate Information (identified by operation id):                            
            ---------------------------------------------------                            
                                                                                           
               2 - filter("O"."TYPE#"<=5 AND "O"."OWNER#"=USERENV('SCHEMAID') AND          
                          "O"."TYPE#">=2 AND "O"."LINKNAME" IS NULL)                       
               4 - access("O"."OBJ#"="T"."OBJ#"(+))                                                       
            统计信息
            ----------------------------------------------------------                     
                      8  recursive calls                                                   
                      0  db block gets                                                     
                   1684  consistent gets                                                   
                      0  physical reads                                                    
                      0  redo size                                                         
                  11810  bytes sent via SQL*Net to client                                  
                    704  bytes received via SQL*Net from client                            
                     31  SQL*Net roundtrips to/from client                                 
                      0  sorts (memory)                                                    
                      0  sorts (disk)                                                      
                    442  rows processed  
         (注:墨绿色部分是EXPLAIN PLAN输出所不具有的)
          该命令参考见<<sql * plus user's guide and reference release 10.2>>  B14357-01.    
          如果想不起来,可以用sql> help set来查看可用SET命令。   
          2)EXPLAIN PLAIN FOR
          explain plan 的标准语法如下:
          explan plan  [set statement_id=  ] [into  table]  for statement  ;
          红色字体部分是可以不要的。
          使用select * from table(dbms_xplan.display())来查看结果.
          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);
          详细的太多,不能一一介绍。总之,作为一般开发,可以把如下执行:
          select * from table(dbms_xplan.display(NULL,NULL,'all')),或者更多是使用默认的  select * from table(dbms_xplan.display);

          直接执行EXPLAIN PLAN FOR SELECT * FROM TAB;
          SQL> set autotrace off;
          SQL> explain plan for select * from tab;
          已解释。
          SQL> select * from table(dbms_xplan.display);
          具体结果略。
          该命令必须参考<<Oracle Database SQL Reference 10g Release 2 (10.2) >> B14200-02
          其它的可以参考视图:V$SQL_WORKAREA,V$SQL_PLAN,V$SQL_PLAN_STATISTICS,V$SQL_PLAN_STATISTICS_ALL。
          可以参考的其它书籍是: Oracle Database Performance Tuning Guide (有关explain输出),Oracle Database Reference(前面提到的动态性能视图,那几个v$开头的).
          3)两种方式的比较
                a) 前面一种方式更加简单,而且只有一次设置,次次有效(SQL*PLUS环境下),输出的结果也更详细(相对于display 的典型输出)。
                b)后面一种方式稍微麻烦一些,需要为每个独立的SQL执行,但优点是输出的结果可以存储到表格中,因为
                    dbms_xplan.display是一个管道表函数,输出的每一行都是varchar2类型。   
          它们的共同点在于,都需要用到表格plan_table ,有关plan_Table的脚本执行脚本ORACLE_HOME\RDBMS\ADMIN\UTLXPLAN.SQL          
          就我个人而言,还是更喜欢用set的方式--比较方便,不需要每次都去查询结果。
          二:可用的参考书籍
          1)sql * plus user's guide and reference release 10.2
          2)Oracle Database SQL Reference 10g Release 2 (10.2)
          3)Oracle Database

    http://lzfhope.blog.163.com/blog/static/63639922007731104819232/?suggestedreading&wumii

    Oracle sqlplus中autotrace错误SP2-0611   

    2007-08-31 10:48:19|  分类: sql解析与技巧 |  标签: |字号 订阅

     
     

    经过验证,我今日遇到问题的确可以用这个方法来解决掉.
    但是是否需要用sys这个用户还值得商榷.其次就是为什么 plustrace 会消失还没有正确的解析.
    Grant
    plustrace to X (X是某个用户)是一定要运行的.

    下文摘录于http://h1yn.itpub.net/post/2084/245634


    autotrace是一项
    SQL*Plus 功能,自动跟踪为 SQL 语句生成一个执行计划并且提供与该语句的处理有关的统计。

    SQL*Plus AUTOTRACE 可以用来替代 SQL Trace 使用,AUTOTRACE 的好处是您不必设置跟踪文件的格式,并且它将自动为 SQL 语句显示执行计划。然而,AUTOTRACE 分析和执行语句;而EXPLAIN PLAN仅分析语句。

    使用AUTOTRACE不会产生跟踪文件。

    一、启用Autotrace功能。任何以SQL*PLUS连接的session都可以用Autotrace,不过还是要做一些设置的,否则可能报错。

    1、报错示例:SQL :> set autotrace on;
    SP2-0613: Unable to verify PLAN_TABLE format or existence
    SP2-0611: Error enabling EXPLAIN report
    SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
    SP2-0611: Error enabling STATISTICS report

    *******************************************************************************

    SQL> set autotrace on;

    SP2-0613: 无法验证 PLAN_TABLE 格式或实体

    SP2-0611: 启用EXPLAIN报告时出现错误

    SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色

    SP2-0611: 启用STATISTICS报告时出现错误

    该错误的的主要原因是由于当前用户下没有PLAN_TABLE这张表及相应的PLUSTRACE角色权限。

    2、解决方法:

    A.以SYS用户登录:

    oracle>sqlplus '/ as sysdba';

    B.运行utlxplan.sql(rdbms/admin) 脚本创建 PLAN_TABLE

    SQL>@ D:oracleora81RDBMSADMINutlxplan.sql

    C.通过执行 plustrce.sql(ORACLE_HOME/sqlplus/admin/plustrce.sql)脚本创建 plustrace 角色,这将V$ 视图上的选择权限授予该角色,也将 plustrace 角色授予 DBA 角 色,脚本部份内容如下:

    drop role plustrace;
    create role plustrace;
    grant select on v_$sesstat to plustrace;
    grant select on v_$statname to plustrace;
    grant select on v_$session to plustrace;
    grant plustrace to dba with admin option;
    D
    .将 plustrace 角色授予当前用户( DBA 角色的用户)

    或grant plustrace to public;

    二、设置Autotrace的命令。

    序号

    命令

    解释

    1

    SET AUTOTRACE OFF

    此为默认值,即关闭Autotrace

    2

    SET AUTOTRACE ON

    产生结果集和解释计划并列出统计

    3

    SET AUTOTRACE ON EXPLAIN

    显示结果集和解释计划不显示统计

    4

    SETAUTOTRACE TRACEONLY

    显示解释计划和统计,尽管执行该语句但您将看不到结果集

    5

    SET AUTOTRACE

    TRACEONLY STATISTICS

    只显示统计

    EgSET AUTOTRACE ON, set timing on, alter session set time_statistics=true;

    三、Autotrace执行计划的各列的涵义

    序号

    列名

    解释

    1

    ID_PLUS_EXP

    每一步骤的行号

    2

    PARENT_ID_PLUS_EXP

    每一步的Parent的级别号

    3

    PLAN_PLUS_EXP

    实际的每步

    4

    OBJECT_NODE_PLUS_EXP

    Dblink或并行查询时才会用到

    四、AUTOTRACE Statistics常用列解释

    序号

    列名

    解释

    1

    db block gets

    buffer cache中读取的block的数量

    2

    consistent gets

    buffer cache中读取的undo数据的block的数量

    3

    physical reads

    从磁盘读取的block的数量

    4

    redo size

    DML生成的redo的大小

    5

    sorts (memory)

    在内存执行的排序量

    7

    sorts (disk)

    在磁盘上执行的排序量

  • 相关阅读:
    linux磁盘扩容脚本不重启
    编译安装redis
    编译安装nginx
    ansible常用模块
    centos7 yum安装ansible
    centos7 salt操作命令
    centos7 yum安装salt
    keep
    MySQL6
    MySQL5
  • 原文地址:https://www.cnblogs.com/rattersnake/p/2993484.html
Copyright © 2011-2022 走看看