【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

posted on 2016-12-24 17:36  Diegoal  阅读(291)  评论(0编辑  收藏  举报

导航