现在的位置: 首页 > 综合 > 正文

收集统计信息

2013年09月08日 ⁄ 综合 ⁄ 共 19327字 ⁄ 字号 评论关闭

收集列的基本信息,不收集柱状图,指定的size等于1(bucket“小桶”=1)
exec dbms_stats.gather_table_stats(user, 'DEPT', cascade=>false, method_opt=>'for columns col1 size 1');

收集列的柱状图信息,指定的size大于等于2小于等于254(bucket“小桶” between 2 and 254)
sec@ora10g>exec dbms_stats.gather_table_stats(user, 'DEPT', cascade=>false, method_opt=>'for columns col1 size 2');

10g中删除列已有的柱状图信息同时保留列的基本统计信息方法:需要重新收集size为1的统计信息
exec dbms_stats.gather_table_stats(user, 'DEPT', cascade=>false, method_opt=>'for columns col1 size 1');

11g中删除已有的柱状图信息同时保留列的基本统计信息得到了简化
exec dbms_stats.delete_column_stats(user, 'DEPT','COL1',col_stat_type=>'HISTOGRAM');
删除整个列的统计信息,使用delete_column_stats
exec dbms_stats.delete_column_stats(user, 'DEPT', 'COL1');

混合打法:同一个过程中收集多个列的统计信息,不同的列指定不同的size数
exec dbms_stats.gather_table_stats(user, 'DEPT', cascade=>false, method_opt => 'for columns col1 size 1 for columns col2 size 2');

 

 

 

收集统计信息的一些例子
例子1对表收集统计信息
BEGIN
   DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
                                 tabname => 'DEPT',
                                 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
                                 method_opt => 'for all columns size repeat',
                                 degree => DBMS_STATS.AUTO_DEGREE,
                                 cascade=>TRUE
                                 );
END;
/
上面的例子收集SCOTT.DEPT表的统计信息。这里面值得关注的一个参数就是method_opt。这个参数控制是否收集列的直方图信息。通常情况下,是不会收集直方图的,关于直方图不是三言两语可以说明白的。它的四个选项method_opt=>'for all columns size skewonly'
ORACLE会根据数据分布收集直方图
method_opt=>'for all columns size repeat'
只有以前收集过直方图,才会收集直方图信息,所以一般我们会设置method_opt 为repeat
method_opt=>'for all columns size auto'
ORACLE会根据数据分布以及列的workload来确定是否收集直方图
method_opt=>'for all columns size interger'
我们自己指定一个bucket值
例子2对某一个schma收集统计信息
BEGIN
   DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'SCOTT',
                                  estimate_percent =>DBMS_STATS.AUTO_SAMPLE_SIZE,
                                  ptions => 'gather auto',
                                  degree  => DBMS_STATS.AUTO_DEGREE,
                                  method_opt => 'for all columns size repeat',
                                  cascade => TRUE
                                 );
END;                               
/
上面的例子收集SCOTT模式下所有对象的统计信息。里面值得注意的一个参数就是options。前面已经讲到过,他与表监控有关。它有四个选项
Options =>’gather’       收集所有对象的统计信息
Options =>’gather empty’ 只收集还没被统计的表
Options =>’gather stale’ 只收集修改量超过10%的表
Options =>’gather auto’  相当于empty+stale ,所以我们一般设置为AUTO。
例子3 对一个分区表收集统计信息
BEGIN
   DBMS_STATS.GATHER_TABLE_STATS(ownname => 'ROBINSON',
                                 tabname => 'P_TEST',
                                 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
                                 method_opt => 'for all columns size repeat',
                                 degree => DBMS_STATS.AUTO_DEGREE,
                                 granularity => 'ALL',
                                 cascade=>TRUE
                                 );
END;
/
上面的例子收集ROBINSON.P_TEST表的统计信息。里面值得注意的一个参数就是granularity,他有7个选项。
granularity => 'ALL'  收集分区,子分区,全局的统计信息
granularity => 'AUTO' 这个是默认的设置,ORACLE会根据分区类型来决定用ALL,GLOBAL AND PARTITION ,还是其他的
granularity => 'DEFAULT' 这个是过期了的
granularity => 'GLOBAL' 收集全局统计信息
granularity => 'GLOBAL AND PARTITION' 收集全局,分区统计信息,但是不收集子分区统计信息
granularity => 'PARTITION' 收集分区统计信息
granularity => 'SUBPARTITION' 收集子分区统计信息
当然我们可以指定partname,自己控制对哪个分区收集统计信息
 

 

 

1  DECLARE
 2  I NUMBER;
 3  BEGIN
 4  FOR i IN 1..100 LOOP
 5   INSERT INTO BHH VALUES(I);
 6  END LOOP;
 7* END;
QL> /

L/SQL 过程已成功完成。

QL> commit;

提交完成。

QL> select count(*) from bhh;

 COUNT(*)
---------
      100

QL> select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID';

未选定行

QL> exec dbms_stats.gather_table_stats('SCOTT','BHH');

L/SQL 过程已成功完成。

QL> select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID';

OLUMN_NAME                    NUM_DISTINCT NUM_BUCKETS HISTOGRAM
----------------------------- ------------ ----------- ---------------
D                                      100           1 NONE

QL>

BEGIN
 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
 tabname => 'BHH',
 estimate_percent =>100, 
  method_opt => 'for all columns size 254',
 degree => DBMS_STATS.AUTO_DEGREE,
 cascade=>TRUE
 );
 END;
 
  强制id列不产生直方图信息
 BEGIN
   DBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                 TABNAME    => 'BHH',
                                 CASCADE    => TRUE,
                                 METHOD_OPT => 'FOR  COLUMNS  ID SIZE  1 ');
 END
 alter table bhh add id2 number
 update bhh set id2=1;
 update bhh set id2=100 where id=100;
 
SQL> select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID                  100           1 NONE

SQL>  SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
      WHERE TABLE_NAME ='BHH';

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                       0              1
BHH                            ID2                      0              1
BHH                            ID                       1            100
BHH                            ID2                      1            100

BEGIN
 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
 tabname => 'BHH',
 estimate_percent =>100, 
  method_opt => 'for all columns size auto',
 degree => DBMS_STATS.AUTO_DEGREE,
 cascade=>TRUE
 );
 END;
 
 SQL> select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID2';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID2                   2           2 FREQUENCY

SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
         WHERE TABLE_NAME ='BHH';

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID2                     99              1
BHH                            ID2                    100            100
BHH                            ID                       0              1
BHH                            ID                       1            100
SQL> update bhh set id2=40 where id=50;

已更新 1 行。

SQL> commit;

SQL> select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID2';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID2                   3           3 FREQUENCY

SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
            WHERE TABLE_NAME ='BHH';

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID2                     98              1
BHH                            ID2                     99             40
BHH                            ID2                    100            100
BHH                            ID                       0              1
BHH                            ID                       1            100

 

BEGIN
 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
 tabname => 'BHH',
 estimate_percent =>100, 
  method_opt => 'for all columns size auto',
 degree => DBMS_STATS.AUTO_DEGREE,
 cascade=>TRUE
 );
 END;
SQL> update bhh set id2=40 where id=55;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID2';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID2                   3           3 FREQUENCY

SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
               WHERE TABLE_NAME ='BHH';

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID2                     97              1
BHH                            ID2                     99             40
BHH                            ID2                    100            100
BHH                            ID                       0              1
BHH                            ID                       1            100

说明:
id2 为1   有97个重复的
id2 为40  有99-97=2个重复值
id2 为100 有100-99个重复值

SQL> update bhh set id2=80 where id=30;

已更新 1 行。

SQL> commit;

提交完成。

SQL>  select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID2';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID2                   4           4 FREQUENCY

SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
                  WHERE TABLE_NAME ='BHH';

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID2                     96              1
BHH                            ID2                     98             40
BHH                            ID2                     99             80
BHH                            ID2                    100            100
BHH                            ID                       0              1
BHH                            ID                       1            100

已选择6行。

 

 

 

实验二:查看id列上的统计信息,id列是1-100 unique值
SQL> BEGIN
  2   DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
  3   tabname => 'BHH',
  4   estimate_percent =>100,
  5    method_opt => 'for all columns size repeat',
  6   degree => DBMS_STATS.AUTO_DEGREE,
  7   cascade=>TRUE
  8   );
  9   END;
 10  /

PL/SQL 过程已成功完成。

SQL>  select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID                  100           1 NONE

SQL>  select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID2';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID2                   4           4 FREQUENCY

SQL>
SQL> BEGIN
  2   DBMS_STATS.GATHER_TABLE_STATS(ownname => 'SCOTT',
  3   tabname => 'BHH',
  4   estimate_percent =>100,
  5    method_opt => 'for all columns size 254',
  6   degree => DBMS_STATS.AUTO_DEGREE,
  7   cascade=>TRUE
  8   );
  9   END;
 10  /

PL/SQL 过程已成功完成。

SQL>
SQL>  select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID2';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID2                   4           4 FREQUENCY

SQL>  select column_name,num_distinct,num_buckets,histogram from dba_tab_col_statistics where table_name='BHH'AND COLUMN_NAME='ID';

COLUMN_NAM NUM_DISTINCT NUM_BUCKETS HISTOGRAM
---------- ------------ ----------- ---------------
ID                  100         100 HEIGHT BALANCED

 

SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HIST
  2                    WHERE TABLE_NAME ='BHH';

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                       1              1
BHH                            ID                       2              2
BHH                            ID                       3              3
BHH                            ID                       4              4
BHH                            ID                       5              5
BHH                            ID                       6              6
BHH                            ID                       7              7
BHH                            ID                       8              8
BHH                            ID                       9              9
BHH                            ID                      10             10
BHH                            ID                      11             11

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      12             12
BHH                            ID                      13             13
BHH                            ID                      14             14
BHH                            ID                      15             15
BHH                            ID                      16             16
BHH                            ID                      17             17
BHH                            ID                      18             18
BHH                            ID                      19             19
BHH                            ID                      20             20
BHH                            ID                      21             21
BHH                            ID                      22             22

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      23             23
BHH                            ID                      24             24
BHH                            ID                      25             25
BHH                            ID                      26             26
BHH                            ID                      27             27
BHH                            ID                      28             28
BHH                            ID                      29             29
BHH                            ID                      30             30
BHH                            ID                      31             31
BHH                            ID                      32             32
BHH                            ID                      33             33

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      34             34
BHH                            ID                      35             35
BHH                            ID                      36             36
BHH                            ID                      37             37
BHH                            ID                      38             38
BHH                            ID                      39             39
BHH                            ID                      40             40
BHH                            ID                      41             41
BHH                            ID                      42             42
BHH                            ID                      43             43
BHH                            ID                      44             44

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      45             45
BHH                            ID                      46             46
BHH                            ID                      47             47
BHH                            ID                      48             48
BHH                            ID                      49             49
BHH                            ID                      50             50
BHH                            ID                      51             51
BHH                            ID                      52             52
BHH                            ID                      53             53
BHH                            ID                      54             54
BHH                            ID                      55             55

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      56             56
BHH                            ID                      57             57
BHH                            ID                      58             58
BHH                            ID                      59             59
BHH                            ID                      60             60
BHH                            ID                      61             61
BHH                            ID                      62             62
BHH                            ID                      63             63
BHH                            ID                      64             64
BHH                            ID                      65             65
BHH                            ID                      66             66

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      67             67
BHH                            ID                      68             68
BHH                            ID                      69             69
BHH                            ID                      70             70
BHH                            ID                      71             71
BHH                            ID                      72             72
BHH                            ID                      73             73
BHH                            ID                      74             74
BHH                            ID                      75             75
BHH                            ID                      76             76
BHH                            ID                      77             77

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      78             78
BHH                            ID                      79             79
BHH                            ID                      80             80
BHH                            ID                      81             81
BHH                            ID                      82             82
BHH                            ID                      83             83
BHH                            ID                      84             84
BHH                            ID                      85             85
BHH                            ID                      86             86
BHH                            ID                      87             87
BHH                            ID                      88             88

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                      89             89
BHH                            ID                      90             90
BHH                            ID                      91             91
BHH                            ID                      92             92
BHH                            ID                      93             93
BHH                            ID                      94             94
BHH                            ID                      95             95
BHH                            ID                      96             96
BHH                            ID                      97             97
BHH                            ID                      98             98
BHH                            ID                      99             99

TABLE_NAME                     COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ---------- --------------- --------------
BHH                            ID                     100            100
BHH                            ID2                     96              1
BHH                            ID2                     98             40
BHH                            ID2                     99             80
BHH                            ID2                    100            100

已选择104行。

抱歉!评论已关闭.