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执行缓慢。  收集统计信息后,表数据量准确,重新生成都执行计划,选择了正确的执行计划!!!

     
  • 相关阅读:
    面试问题整理Andorid版本 date: 2017-1-12 21:14:36 categories: 技术
    轻量级的C++插件框架
    C++程序在Windows平台上各种定位内存泄漏的方法,并对比了它们的优缺点
    Facebook App 的头文件会有更多的收获
    合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友_python
    使用python在校内发人人网状态(人人网看状态)_python
    使用PYTHON创建XML文档_python
    优秀的缓存请求库,快速请求接口和图片:WTRequestCenter
    让读者快速了解RocketMQ消息中间件需要解决哪些问题
    编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤
  • 原文地址:https://www.cnblogs.com/lvcha001/p/13246847.html
Copyright © 2011-2022 走看看