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)

在磁盘上执行的排序量

原文地址:https://www.cnblogs.com/rattersnake/p/2993484.html