zoukankan      html  css  js  c++  java
  • Oracle执行计划与统计信息的一些总结

     

    [日期:2011-08-05]
    来源:Linux社区  作者:wangshengfeng1986211
    [字体: ]

    2010-07-01 15:03

    1、SET AUTOTRACE ON EXPLAIN
    (set autot on exp)
    SQLPLUS的命令,在执行SQL语句的同时显示执行计划,设置EXP(LAIN)的目的是只显示执行计划而不显示统计信息.。
    2、SQL>explain plan for select ````````;
    SQL>select * from table(dbms_xplan.display);

    执行了set autotrace on explain语句之后,接下来的查询、插入、更新、删除语句就会显示执行计划,直到执行“set autotrace off;”语句。如果是设置了set autotrace on,除了会显示执行计划之外,还会显示一些有用的统计信息。

    执行EXPLAIN PLAN FOR 可以只显示执行计划,然后执行如下查询

    SQL> select * from table(dbms_xplan.display);

    如:

    SQL> explain plan for select * from emp where deptno='20';

    Explained.

    SQL> select * from table(dbms_xplan.display);

    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------
    Plan hash value: 3956160932

    --------------------------------------------------------------------------
    | Id   | Operation          | Name | Rows   | Bytes | Cost (%CPU)| Time      |
    --------------------------------------------------------------------------
    |    0 | SELECT STATEMENT   |       |      5 |    150 |      3    (0)| 00:00:01 |
    |*   1 |   TABLE ACCESS FULL| EMP   |      5 |    150 |      3    (0)| 00:00:01 |
    --------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------

    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------

        1 - filter("DEPTNO"=20)

    13 rows selected.

    3、SQL>exec dbms_stats.delete_table_stats(USER,'表');(删除表的统计信息)

    SQL>exec dbms_stats.gather_table_stats(USER,'表',METHOD_OPT=>'FOR ALL COLUMNS SIZE 100')(收集表的统计信息)

    4、AUTOTRACE的几个常用选项

           set autotrace off ---------------- 不生成autotrace 报告,这是缺省模式
    set autotrace on explain ------ autotrace只显示优化器执行路径报告
    set autotrace on statistics -- 只显示执行统计信息
    set autotrace on ----------------- 包含执行计划和统计信息
    set autotrace traceonly ------ 同set autotrace on,但是不显示查询输

    (1). set autotrace on explain; --只显示执行计划
    SQL> set autotrace on explain;
    SQL> 

    select count(*) from dba_objects;
    COUNT(*)
    ----------
        31820
    Execution Plan
    ----------------------------------------------------------
      0      SELECT STATEMENT Optimizer=CHOOSE
      1    0   SORT (AGGREGATE)
      2    1     VIEW OF 'DBA_OBJECTS'
      3    2       UNION-ALL
      4    3         FILTER
      5    4           TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
      6    5             NESTED LOOPS
      7    6               TABLE ACCESS (FULL) OF 'USER$'
      8    6               INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
      9    4           TABLE ACCESS (BY INDEX ROWID) OF 'IND$'
    10    9             INDEX (UNIQUE SCAN) OF 'I_IND1' (UNIQUE)
    11    3         NESTED LOOPS
    12   11           TABLE ACCESS (FULL) OF 'USER$'
    13   11           INDEX (RANGE SCAN) OF 'I_LINK1' (NON-UNIQUE)
    (2). set autotrace on statistics;--只显示统计信息
    SQL> set autotrace on statistics;
    SQL> select count(*) from dba_objects;
    COUNT(*)
    ----------
        31820
    Statistics
    ----------------------------------------------------------
             0 recursive calls
             0 db block gets
         25754 consistent gets
             0 physical reads
             0 redo size
           383 bytes sent via SQL*Net to client
           503 bytes received via SQL*Net from client
             2 SQL*Net roundtrips to/from client
             0 sorts (memory)
             0 sorts (disk)
             1 rows processed
    (3). set autotrace traceonly;--同set autotrace on 只是不显示查询输出
    SQL> set autotrace traceonly;
    SQL> select count(*) from dba_objects;
    Execution Plan
    ----------------------------------------------------------
      0      SELECT STATEMENT Optimizer=CHOOSE
      1    0   SORT (AGGREGATE)
      2    1     VIEW OF 'DBA_OBJECTS'
      3    2       UNION-ALL
      4    3         FILTER
      5    4           TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
      6    5             NESTED LOOPS
      7    6               TABLE ACCESS (FULL) OF 'USER$'
    8    6               INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
      9    4           TABLE ACCESS (BY INDEX ROWID) OF 'IND$'
    10    9             INDEX (UNIQUE SCAN) OF 'I_IND1' (UNIQUE)
    11    3         NESTED LOOPS
    12   11           TABLE ACCESS (FULL) OF 'USER$'
    13   11           INDEX (RANGE SCAN) OF 'I_LINK1' (NON-UNIQUE)
    Statistics
    ----------------------------------------------------------
             0 recursive calls
             0 db block gets
         25754 consistent gets
             0 physical reads
             0 redo size
           383 bytes sent via SQL*Net to client
           503 bytes received via SQL*Net from client
             2 SQL*Net roundtrips to/from client
             0 sorts (memory)
             0 sorts (disk)
             1 rows processed
    (4).set autotrace traceonly explain;--比较实用的选项,只显示执行计划,但是与set autotrace on explain;相比不会执行语句,对于仅仅查看大表的Explain Plan非常管用。
    SQL> set autotrace traceonly explain;
    SQL> select * from dba_objects;
    已用时间: 00: 00: 00.00
    Execution Plan
    ----------------------------------------------------------
      0      SELECT STATEMENT Optimizer=CHOOSE
      1    0   VIEW OF 'DBA_OBJECTS'
      2    1     UNION-ALL
      3    2       FILTER
      4    3         TABLE ACCESS (BY INDEX ROWID) OF 'OBJ$'
      5    4           NESTED LOOPS
      6    5             TABLE ACCESS (FULL) OF 'USER$'
      7    5             INDEX (RANGE SCAN) OF 'I_OBJ2' (UNIQUE)
      8    3         TABLE ACCESS (BY INDEX ROWID) OF 'IND$'
      9    8           INDEX (UNIQUE SCAN) OF 'I_IND1' (UNIQUE)
    10    2       TABLE ACCESS (BY INDEX ROWID) OF 'LINK$'
    11   10         NESTED LOOPS
    12   11           TABLE ACCESS (FULL) OF 'USER$'
    13   11           INDEX (RANGE SCAN) OF 'I_LINK1' (NON-UNIQUE)

    5、analyze

    analyze table hr.employees compute(estimate) statistics;(compute收集每一行数据的统计信息,比较耗时;estimate收集一部分数据行的统计信息)

    select t.owner,t.table_name,t.tablespace_name,t.blocks,t.empty_blocks,t.avg_space
    from dba_tables t
    where t.owner='HR';

  • 相关阅读:
    10个最好的游戏开发在线资源
    程序员什么时候该考虑辞职
    程序员常去的14个顶级开发社区
    如何成为10倍速的程序员
    (通用)深度学习环境搭建:tensorflow安装教程及常见错误解决
    20行JS代码实现贪吃蛇
    程序员必备工具目录
    发布 Google Chrome插件教程
    高并发思路
    30分钟入门Java
  • 原文地址:https://www.cnblogs.com/snailwong/p/5904098.html
Copyright © 2011-2022 走看看