zoukankan      html  css  js  c++  java
  • 【Oracle】DBMS_STATS.GATHER_TABLE_STATS分析表

    表分析,简单的说,就是收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径。通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以进行优化。
    语法:

    DBMS_STATS.GATHER_TABLE_STATS (   
    ownname          VARCHAR2,      
    tabname          VARCHAR2,       
    partname         VARCHAR2,             
    estimate_percent NUMBER,         
    block_sample     BOOLEAN,        
    method_opt       VARCHAR2,       
    degree           NUMBER,         
    granularity      VARCHAR2,       
    cascade          BOOLEAN,      
    stattab          VARCHAR2,       
    statid           VARCHAR2,      
    statown          VARCHAR2,       
    no_invalidate    BOOLEAN,       
    force            BOOLEAN        
    ); 

    列含义:
    ownname #要分析表的拥有者
    tabname #要分析表的表名
    partname #分区的名字,只对分区表或者分区索引有用,默认为:null
    estimate_percent#采样行的百分比,取值范围[0.000001,100],null是全部分析不采样,常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.
    block_sample #是否用块采样代替行采样,默认为false
    method_opt #method_opt:决定histograms信息是怎样被统计的,统计指定列的直方图时建议使用SKEWONLY
    method_opt的取值如下:
    for all columns:统计所有列的histograms.
    for all indexed columns:统计所有indexed列的histograms.
    for all hidden columns:统计你看不到列的histograms
    for columns SIZE | REPEAT | AUTO | SKEWONLY
    SKEWONLY:统计指定列的histograms.N的取值范围[1,254]
    REPEAT上次统计过的histograms
    AUTO由oracle决定N的大小
    degree #决定并行度,默认为null
    granularity #设置分区表收集统计信息的粒度 granularity取值:
    all:对表达分区,分区,子分区的数据都做分析
    auto:Oracle根据分区的类型,自行决定做哪一种粒 度的分析
    global:只做全局级别非分析
    global and partition:只对全局和分区级别做分析,对子分区不做分析,这是和all的一个区别
    partition:只对分区级别做分析
    subpartition:只对子分区做分析
    cascade #是收集索引的信息.默认为falase
    stattab #指定要存储统计信息的表,
    statid #对存储在同一个stattab中的表的统计信息做区分
    statown #存储统计信息 表的拥有者
    no_invalidate #true:当收集完统计信息后,收集对象的cursor不会失效(不会产生新的执行计划,子游标);
    false:当收集完统计信息后,收集对象的cursor会立即失效(新的执行计划,新的子游标)
    force #即使表锁定了也收集统计信息

    统计信息导入导出:
    1:创建测试表

    SYS@GOOD> create table t as select * from all_objects;
    
    Table created.

    2.对表进行分析

    SYS@GOOD> BEGIN
      2  dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T');
      3  END;
      4  /
    
    PL/SQL procedure successfully completed.

    3.创建表,存放统计信息

    SYS@GOOD> BEGIN
      2  dbms_stats.create_stat_table(ownname=>'SCOTT',stattab=>'STAT_TABLE');
      3  END;
      4  /
    
    PL/SQL procedure successfully completed.

    4.导出统计信息到stat_table表中

    SYS@GOOD> begin
      2  dbms_stats.export_table_stats(ownname=>'SYS',tabname=>'T',statown=>'SCOTT',stattab=>'STAT_TABLE');
      3  end;
      4  /
    
    PL/SQL procedure successfully completed.

    5.删除统计信息

    SYS@GOOD> begin
      2  dbms_stats.delete_table_stats(ownname=>'SYS',tabname=>'T');
      3  end;
      4  /
    
    PL/SQL procedure successfully completed.

    6.导入统计信息

    SYS@GOOD> begin
      2  dbms_stats.import_table_stats(ownname=>'SYS',tabname=>'T',statown=>'SCOTT',stattab=>'STAT_TABLE');
      3  end;
      4  /
    
    PL/SQL procedure successfully completed.

    7.验证

    SYS@GOOD> SELECT num_rows,blocks,empty_blocks as empty, avg_space, chain_cnt, avg_row_len FROM dba_tables WHERE owner = 'SYS'
      2   AND table_name = 'T';
    
      NUM_ROWS     BLOCKS      EMPTY  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN
    ---------- ---------- ---------- ---------- ---------- -----------
         85265       1216          0          0          0          98
  • 相关阅读:
    简单记录下SpringCloud的微服务架构和一些概念
    Spring创建对象的几种方法
    几个设计模式总结
    为什么用B+树做索引&MySQL存储引擎简介
    Spring的ioc(DI)复习概念和原理简介
    spring bean中注入HttpServletRequest成员变量的思考(转载)
    类加载机制 + Classloader.loadClass(String name)和Class.forName(String name)
    记一下一道关于finally的题
    bio,nio,aio简介
    Integer一类的比较问题
  • 原文地址:https://www.cnblogs.com/NextAction/p/7366674.html
Copyright © 2011-2022 走看看