zoukankan      html  css  js  c++  java
  • 创建索引不会级联收集表的统计信息?

    开发DBA,对Oracle大表治理流程如下:

    1.创建temp表,与生产环境大表相同表结构;

    2.对生产环境大表rename to table_name_bak;

    3.对temp表 rename to table_name 生产环境表;

    4.此时新的业务表无数据,insert into table_name select * from table_name_bak where date>sysdate-31;

    5.对新建的表,同步bak表的索引!

    6.SQL测试,发现存在性能问题,非常慢,原本执行SQL很快,大表几十G,新的表才30W条记录???

    统计信息的问题,收集后OK

    exec dbms_stats.gather_table_stats(ownname=>'A',tabname=>'B',cascade=>true,degree=>6,estimate_percent=>50);

    ?为啥?

    实验测试:

    SQL> create table a as select * from dba_objects;
    SQL> create index a_id on a(object_id);
    SQL> set autotrace on 
    SQL> select count(*) from a where object_id=7788 order by object_id;
    
      COUNT(*)
    ----------
             1
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2227953900
    -------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |    13 |     1   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE   |      |     1 |    13 |            |          |
    |*  2 |   INDEX RANGE SCAN| A_ID |     1 |    13 |     1   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - access("OBJECT_ID"=7788)
    Note
    -----
       - dynamic sampling used for this statement (level=2)
    本次测试的举例不太好,因为SQL走了索引,但是为啥SQL走了索引呢? 是由于ORACLE 11G动态采样,ORACLE执行计划选择对了。
    但是生产环境,动态采样后,Oracle发现走索引成本更高,走全表扫描了!!!

    SQL> SELECT NUM_ROWS,EMPTY_BLOCKS,BLOCKS,LAST_ANALYZED FROM DBA_TABLES WHERE OWNER='YZ' AND TABLE_NAME='A';

    NUM_ROWS EMPTY_BLOCKS BLOCKS LAST_ANAL
    ---------- ------------ ---------- ---------

    SQL> SELECT NUM_ROWS,SAMPLE_SIZE,LEAF_BLOCKS,LAST_ANALYZED FROM DBA_INDEXES WHERE TABLE_OWNER='YZ' AND TABLE_NAME='A';

    NUM_ROWS SAMPLE_SIZE LEAF_BLOCKS LAST_ANAL
    ---------- ----------- ----------- ---------
    87096 87096 193 28-APR-20

     表统计信息0,因此生产环境的问题,就是创建索引,这个只会收集索引统计信息,而非级联表,SQL执行动态采用,数据不准确,导致最终的SQL执行计划选择全表扫描,SQL执行缓慢。  收集统计信息后,表数据量准确,重新生成都执行计划,选择了正确的执行计划!!!

     
  • 相关阅读:
    康托(逆)展开(2015.8.6)
    高精度计算(2015.8.1)
    笔记(2015.8.1)
    筛法求素数(2015.7.30)
    欧几里德算法(2015.7.28)
    快速幂取模(2015.7.29)
    同余
    图论相关算法
    笔记(2015-07-24)
    ACM进阶计划
  • 原文地址:https://www.cnblogs.com/lvcha001/p/13246847.html
Copyright © 2011-2022 走看看