当前位置: 首页 > 基础 > 正文

下面是测试自动作业分析统计信息时,怎么处理表的增量模式的统计信息:

1 版本

www.htz.pw > select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

2,脚本

-- cre_db_stats.sql begin --
  -- gather DB stats
  set echo on
  prompt * * * Hit ENTER! * * *
  PAUSE
 exec DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER AUTO');
-- cre_db_stats.sql end --

-- d_stats_ex.sql begin --
  -- Query stats
  set echo on

  select partition_name,sample_size,num_rows,  LAST_ANALYZED
   from dba_tab_partitions
  where table_owner=user
  and table_name='PARTTABLE'
  order by partition_name;

  select table_name,sample_size,num_rows,  LAST_ANALYZED
  from dba_tables
  where owner=user
  and table_name='PARTTABLE';

  select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
 , SAMPLE_SIZE, AVG_COL_LEN
  from dba_tab_columns
  where owner=user
  and table_name='PARTTABLE'
  order by column_id;
-- d_stats_ex.sql end --
-- ex_auto_inc1.sql begin ---
        set echo on
        alter session set nls_date_format='DD-MM-YYYY HH24:MI:SS';
        drop table PARTTABLE purge;
        CREATE TABLE PARTTABLE
            (    col1        DATE,
                 col2        number,
                 col3        number,
                 constraint   pk_parttable primary key (col1,col2)
            )
                PARTITION BY RANGE (col1)
                (PARTITION PARTTABLE_1995 VALUES LESS THAN (TO_DATE('01-JAN-1996','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
                 PARTITION PARTTABLE_1996 VALUES LESS THAN (TO_DATE('01-JAN-1997','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
                 PARTITION PARTTABLE_1997 VALUES LESS THAN (TO_DATE('01-JAN-1998','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
                 PARTITION PARTTABLE_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
                 PARTITION PARTTABLE_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE = American'))
                );

        -- 配置表增量统计信息的前提,下面4个条件,决一不同。
        begin
        dbms_stats.set_table_prefs(user, 'PARTTABLE', 'ESTIMATE_PERCENT', DBMS_STATS.AUTO_SAMPLE_SIZE);
        dbms_stats.set_table_prefs(user, 'PARTTABLE', 'INCREMENTAL', 'TRUE');
        dbms_stats.set_table_prefs(user, 'PARTTABLE', 'PUBLISH', 'TRUE');
        dbms_stats.set_table_prefs(user, 'PARTTABLE', 'GRANULARITY', 'AUTO');
        end;
        /

        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum,rownum*2 from dba_objects where rownum<101);

        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1995','DD-MON-YYYY')+rownum, rownum/3,rownum*3 from dba_objects where rownum<101);

        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum/3,rownum*3 from dba_objects where rownum<101);

        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1999','DD-MON-YYYY')+rownum, rownum*rownum,rownum*3 from dba_objects where rownum<101);
        commit;
        exec dbms_stats.flush_database_monitoring_info;
        --查看表上面更行的行数统计
        @table_modification.sql
        -- 删除表上的统计信息
        exec dbms_stats.delete_table_stats(ownname=>user, tabname=>'PARTTABLE', cascade_columns=>true, cascade_indexes=>true);
        -- 查看表与列的统计信息
        start d_stats_ex
        -- 自动作业收集统计信息
        start cre_db_stats
        start d_stats_ex
        -- dba_tab_modification记录已经被清空
        @table_modification.sql
        -- 向表空间插入数据,但是小于表总行数的10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1998','DD-MON-YYYY')+rownum, rownum/3,rownum*3 from dba_objects where rownum<40);
        commit;
        exec dbms_stats.flush_database_monitoring_info;
        -- 这里可以看到表与1998分区上分别INSERT了39条记录
        @table_modification.sql
        --收集统计信息,
        start cre_db_stats
        -- 这里可以发现1998分区的统计信息发生了更改,表与其它分区的统计信息并没有发生变化。
        start d_stats_ex

        --查看表上面更行的行数统计,这里应该能发现表上面变化是39行
        @table_modification.sql
        --分区1997插入10行小于此分区的10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},1996分区插入1行,表上更改大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum+101,rownum*2 from dba_objects where rownum<2);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum+200,rownum*2 from dba_objects where rownum<11);
        commit;
        @table_modification.sql
        start cre_db_stats
        --这里应该是可以看见2个分区与的统计信息发生变化,其它的分区信息没有变化 。
        start d_stats_ex
        --这里应该是空
        @table_modification.sql
        --下面是每一个分区插入一行数据,总修改行小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum+103,rownum*2 from dba_objects where rownum<2);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1995','DD-MON-YYYY')+rownum, rownum+103,rownum*3 from dba_objects where rownum<2);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum+103,rownum*3 from dba_objects where rownum<2);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1999','DD-MON-YYYY')+rownum, rownum+103,rownum*3 from dba_objects where rownum<2);
        commit;
        @table_modification.sql
        start cre_db_stats
        --这里应该是所有的分区都不收集。
        start d_stats_ex
        --每个分区变化为1,除1998分区
        @table_modification.sql
        --向分区分别插入行,总插入行数大于表的10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},其中一个分区的插入行数大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},一个分区不插入数据,其它分区小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<50);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<9);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1995','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<9);
        insert into PARTTABLE select * from (select TO_DATE('01-JAN-1999','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<9);
        commit;
        @table_modification.sql
        start cre_db_stats
        -- 这里可以发现除1998分区外,表与分区的统计信息都发生了变化。说明当表的更改行大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}的时候,表会更新表的统计信息,并更新有发生了dml操作的分区的统计信息。
        start d_stats_ex
-- ex_auto_inc1.sql end ---

3,脚本执行结果

www.htz.pw > @/tmp/ex_auto_inc1.sql
www.htz.pw > -- ex_auto_inc1.sql begin ---
www.htz.pw >         set echo on
www.htz.pw >         alter session set nls_date_format='DD-MM-YYYY HH24:MI:SS';

Session altered.

www.htz.pw >         drop table PARTTABLE purge;

Table dropped.

www.htz.pw >         CREATE TABLE PARTTABLE
  2              (    col1        DATE,
  3                   col2        number,
  4                   col3        number,
  5                   constraint   pk_parttable primary key (col1,col2)
  6              )
  7                  PARTITION BY RANGE (col1)
  8                  (PARTITION PARTTABLE_1995 VALUES LESS THAN (TO_DATE('01-JAN-1996','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
  9                   PARTITION PARTTABLE_1996 VALUES LESS THAN (TO_DATE('01-JAN-1997','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
 10                   PARTITION PARTTABLE_1997 VALUES LESS THAN (TO_DATE('01-JAN-1998','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
 11                   PARTITION PARTTABLE_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY','NLS_DATE_LANGUAGE = American')),
 12                   PARTITION PARTTABLE_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY','NLS_DATE_LANGUAGE = American'))
 13                  );

Table created.

www.htz.pw >
www.htz.pw >         -- 配置表增量统计信息的前提,下面4个条件,决一不同。
www.htz.pw >         begin
  2          dbms_stats.set_table_prefs(user, 'PARTTABLE', 'ESTIMATE_PERCENT', DBMS_STATS.AUTO_SAMPLE_SIZE);
  3          dbms_stats.set_table_prefs(user, 'PARTTABLE', 'INCREMENTAL', 'TRUE');
  4          dbms_stats.set_table_prefs(user, 'PARTTABLE', 'PUBLISH', 'TRUE');
  5          dbms_stats.set_table_prefs(user, 'PARTTABLE', 'GRANULARITY', 'AUTO');
  6          end;
  7          /

PL/SQL procedure successfully completed.

www.htz.pw >
www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum,rownum*2 from dba_objects where rownum<101);

100 rows created.

www.htz.pw >
www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1995','DD-MON-YYYY')+rownum, rownum/3,rownum*3 from dba_objects where rownum<101);

100 rows created.

www.htz.pw >
www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum/3,rownum*3 from dba_objects where rownum<101);

100 rows created.

www.htz.pw >
www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1999','DD-MON-YYYY')+rownum, rownum*rownum,rownum*3 from dba_objects where rownum<101);

100 rows created.

www.htz.pw >         commit;

Commit complete.

www.htz.pw >         exec dbms_stats.flush_database_monitoring_info;

PL/SQL procedure successfully completed.

www.htz.pw >         --查看表上面更行的行数统计
www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

OWNER           TABLE_NAME                PART            SUBPART            INSERTS    UPDATES    DELETES TIMESTAMP           TRUNCATED  DROP_SEGMENTS
--------------- ------------------------- --------------- --------------- ---------- ---------- ---------- ------------------- ---------- -------------
SCOTT           PARTTABLE                                                        400          0          0 2015-02-09 11:57:11 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1995                         100          0          0 2015-02-09 11:57:11 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1996                         100          0          0 2015-02-09 11:57:11 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1997                         100          0          0 2015-02-09 11:57:11 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1999                         100          0          0 2015-02-09 11:57:11 NO                     0

www.htz.pw >         -- 删除表上的统计信息
www.htz.pw >         exec dbms_stats.delete_table_stats(ownname=>user, tabname=>'PARTTABLE', cascade_columns=>true, cascade_indexes=>true);

PL/SQL procedure successfully completed.

www.htz.pw >         -- 查看表与列的统计信息
www.htz.pw >         start d_stats_ex
www.htz.pw > -- d_stats_ex.sql begin --
www.htz.pw >   -- Query stats
www.htz.pw >   set echo on
www.htz.pw >
www.htz.pw >   select partition_name,sample_size,num_rows,  LAST_ANALYZED
  2     from dba_tab_partitions
  3    where table_owner=user
  4    and table_name='PARTTABLE'
  5    order by partition_name;

PART            SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
--------------- ----------- ---------- -------------------
PARTTABLE_1995
PARTTABLE_1996
PARTTABLE_1997
PARTTABLE_1998
PARTTABLE_1999

www.htz.pw >
www.htz.pw >   select table_name,sample_size,num_rows,  LAST_ANALYZED
  2    from dba_tables
  3    where owner=user
  4    and table_name='PARTTABLE';

TABLE_NAME                SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
------------------------- ----------- ---------- -------------------
PARTTABLE

www.htz.pw >
www.htz.pw >   select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
  2   , SAMPLE_SIZE, AVG_COL_LEN
  3    from dba_tab_columns
  4    where owner=user
  5    and table_name='PARTTABLE'
  6    order by column_id;

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS LAST_ANALYZED       SAMPLE_SIZE AVG_COL_LEN
------------------------------ ------------ ---------- ---------- ------------------- ----------- -----------
COL1
COL2
COL3

www.htz.pw > -- d_stats_ex.sql end --
www.htz.pw >
www.htz.pw >
www.htz.pw >         -- 自动作业收集统计信息
www.htz.pw >         start cre_db_stats
www.htz.pw > -- cre_db_stats.sql begin --
www.htz.pw >   -- gather DB stats
www.htz.pw >   set echo on
www.htz.pw > exec DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER AUTO');

PL/SQL procedure successfully completed.

www.htz.pw > -- cre_db_stat.sql end --
www.htz.pw >         start d_stats_ex
www.htz.pw > -- d_stats_ex.sql begin --
www.htz.pw >   -- Query stats
www.htz.pw >   set echo on
www.htz.pw >
www.htz.pw >   select partition_name,sample_size,num_rows,  LAST_ANALYZED
  2     from dba_tab_partitions
  3    where table_owner=user
  4    and table_name='PARTTABLE'
  5    order by partition_name;

PART            SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
--------------- ----------- ---------- -------------------
PARTTABLE_1995          100        100 2015-02-09 11:57:11
PARTTABLE_1996          100        100 2015-02-09 11:57:11
PARTTABLE_1997          100        100 2015-02-09 11:57:11
PARTTABLE_1998                       0 2015-02-09 11:57:11
PARTTABLE_1999          100        100 2015-02-09 11:57:11

www.htz.pw >
www.htz.pw >   select table_name,sample_size,num_rows,  LAST_ANALYZED
  2    from dba_tables
  3    where owner=user
  4    and table_name='PARTTABLE';

TABLE_NAME                SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
------------------------- ----------- ---------- -------------------
PARTTABLE                         400        400 2015-02-09 11:57:11

www.htz.pw >
www.htz.pw >   select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
  2   , SAMPLE_SIZE, AVG_COL_LEN
  3    from dba_tab_columns
  4    where owner=user
  5    and table_name='PARTTABLE'
  6    order by column_id;

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS LAST_ANALYZED       SAMPLE_SIZE AVG_COL_LEN
------------------------------ ------------ ---------- ---------- ------------------- ----------- -----------
COL1                                    400      .0025          0 2015-02-09 11:57:11         400           8
COL2                                    257 .003891051          0 2015-02-09 11:57:11         400          10
COL3                                    167 .005988024          0 2015-02-09 11:57:11         400           4

www.htz.pw > -- d_stats_ex.sql end --
www.htz.pw >
www.htz.pw >
www.htz.pw >         -- dba_tab_modification记录已经被清空
www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

no rows selected

www.htz.pw >         -- 向表空间插入数据,但是小于表总行数的10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}
www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1998','DD-MON-YYYY')+rownum, rownum/3,rownum*3 from dba_objects where rownum<40);

39 rows created.

www.htz.pw >         commit;

Commit complete.

www.htz.pw >         exec dbms_stats.flush_database_monitoring_info;

PL/SQL procedure successfully completed.

www.htz.pw >         -- 这里可以看到表与1998分区上分别INSERT了39条记录
www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

OWNER           TABLE_NAME                PART            SUBPART            INSERTS    UPDATES    DELETES TIMESTAMP           TRUNCATED  DROP_SEGMENTS
--------------- ------------------------- --------------- --------------- ---------- ---------- ---------- ------------------- ---------- -------------
SCOTT           PARTTABLE                 PARTTABLE_1998                          39          0          0 2015-02-09 11:57:12 NO                     0
SCOTT           PARTTABLE                                                         39          0          0 2015-02-09 11:57:12 NO                     0

www.htz.pw >         --收集统计信息
www.htz.pw >             start cre_db_stats
www.htz.pw > -- cre_db_stats.sql begin --
www.htz.pw >   -- gather DB stats
www.htz.pw >   set echo on
www.htz.pw > exec DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER AUTO');

PL/SQL procedure successfully completed.

www.htz.pw > -- cre_db_stat.sql end --
www.htz.pw >         -- 这里可以发现1998分区的统计信息发生了更改,表与其它分区的统计信息并没有发生变化。
www.htz.pw >         start d_stats_ex
www.htz.pw > -- d_stats_ex.sql begin --
www.htz.pw >   -- Query stats
www.htz.pw >   set echo on
www.htz.pw >
www.htz.pw >   select partition_name,sample_size,num_rows,  LAST_ANALYZED
  2     from dba_tab_partitions
  3    where table_owner=user
  4    and table_name='PARTTABLE'
  5    order by partition_name;

PART            SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
--------------- ----------- ---------- -------------------
PARTTABLE_1995          100        100 2015-02-09 11:57:11
PARTTABLE_1996          100        100 2015-02-09 11:57:11
PARTTABLE_1997          100        100 2015-02-09 11:57:11
PARTTABLE_1998           39         39 2015-02-09 11:57:12
PARTTABLE_1999          100        100 2015-02-09 11:57:11

www.htz.pw >
www.htz.pw >   select table_name,sample_size,num_rows,  LAST_ANALYZED
  2    from dba_tables
  3    where owner=user
  4    and table_name='PARTTABLE';

TABLE_NAME                SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
------------------------- ----------- ---------- -------------------
PARTTABLE                         400        400 2015-02-09 11:57:11

www.htz.pw >
www.htz.pw >   select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
  2   , SAMPLE_SIZE, AVG_COL_LEN
  3    from dba_tab_columns
  4    where owner=user
  5    and table_name='PARTTABLE'
  6    order by column_id;

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS LAST_ANALYZED       SAMPLE_SIZE AVG_COL_LEN
------------------------------ ------------ ---------- ---------- ------------------- ----------- -----------
COL1                                    400      .0025          0 2015-02-09 11:57:11         400           8
COL2                                    257 .003891051          0 2015-02-09 11:57:11         400          10
COL3                                    167 .005988024          0 2015-02-09 11:57:11         400           4

www.htz.pw > -- d_stats_ex.sql end --
www.htz.pw >
www.htz.pw >
www.htz.pw >
www.htz.pw >         --查看表上面更行的行数统计,这里应该能发现表上面变化是39
www.htz.pw >           @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

OWNER           TABLE_NAME                PART            SUBPART            INSERTS    UPDATES    DELETES TIMESTAMP           TRUNCATED  DROP_SEGMENTS
--------------- ------------------------- --------------- --------------- ---------- ---------- ---------- ------------------- ---------- -------------
SCOTT           PARTTABLE                                                         39          0          0 2015-02-09 11:57:12 NO                     0

www.htz.pw >         --分区1997插入10行小于此分区的10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},1996分区插入1行,表上更改大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}
www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum+101,rownum*2 from dba_objects where rownum<2);

1 row created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum+200,rownum*2 from dba_objects where rownum<11);

10 rows created.

www.htz.pw >         commit;

Commit complete.

www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

OWNER           TABLE_NAME                PART            SUBPART            INSERTS    UPDATES    DELETES TIMESTAMP           TRUNCATED  DROP_SEGMENTS
--------------- ------------------------- --------------- --------------- ---------- ---------- ---------- ------------------- ---------- -------------
SCOTT           PARTTABLE                                                         39          0          0 2015-02-09 11:57:12 NO                     0

www.htz.pw >         start cre_db_stats
www.htz.pw > -- cre_db_stats.sql begin --
www.htz.pw >   -- gather DB stats
www.htz.pw >   set echo on
www.htz.pw > exec DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER AUTO');

PL/SQL procedure successfully completed.

www.htz.pw > -- cre_db_stat.sql end --
www.htz.pw >         --这里应该是可以看见2个分区与的统计信息发生变化,其它的分区信息没有变化 。
www.htz.pw >         start d_stats_ex
www.htz.pw > -- d_stats_ex.sql begin --
www.htz.pw >   -- Query stats
www.htz.pw >   set echo on
www.htz.pw >
www.htz.pw >   select partition_name,sample_size,num_rows,  LAST_ANALYZED
  2     from dba_tab_partitions
  3    where table_owner=user
  4    and table_name='PARTTABLE'
  5    order by partition_name;

PART            SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
--------------- ----------- ---------- -------------------
PARTTABLE_1995          100        100 2015-02-09 11:57:11
PARTTABLE_1996          101        101 2015-02-09 11:57:13
PARTTABLE_1997          110        110 2015-02-09 11:57:13
PARTTABLE_1998           39         39 2015-02-09 11:57:12
PARTTABLE_1999          100        100 2015-02-09 11:57:11

www.htz.pw >
www.htz.pw >   select table_name,sample_size,num_rows,  LAST_ANALYZED
  2    from dba_tables
  3    where owner=user
  4    and table_name='PARTTABLE';

TABLE_NAME                SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
------------------------- ----------- ---------- -------------------
PARTTABLE                         450        450 2015-02-09 11:57:13

www.htz.pw >
www.htz.pw >   select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
  2   , SAMPLE_SIZE, AVG_COL_LEN
  3    from dba_tab_columns
  4    where owner=user
  5    and table_name='PARTTABLE'
  6    order by column_id;

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS LAST_ANALYZED       SAMPLE_SIZE AVG_COL_LEN
------------------------------ ------------ ---------- ---------- ------------------- ----------- -----------
COL1                                    439 .002277904          0 2015-02-09 11:57:13         450           8
COL2                                    268 .003731343          0 2015-02-09 11:57:13         450          11
COL3                                    167 .005988024          0 2015-02-09 11:57:13         450           4

www.htz.pw > -- d_stats_ex.sql end --
www.htz.pw >
www.htz.pw >
www.htz.pw >         --这里应该是空
www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

no rows selected

www.htz.pw >         --下面是每一个分区插入一行数据,总修改行小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}
www.htz.pw >            insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum+103,rownum*2 from dba_objects where rownum<2);

1 row created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1995','DD-MON-YYYY')+rownum, rownum+103,rownum*3 from dba_objects where rownum<2);

1 row created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum+103,rownum*3 from dba_objects where rownum<2);

1 row created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1999','DD-MON-YYYY')+rownum, rownum+103,rownum*3 from dba_objects where rownum<2);

1 row created.

www.htz.pw >         commit;

Commit complete.

www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

no rows selected

www.htz.pw >         start cre_db_stats
www.htz.pw > -- cre_db_stats.sql begin --
www.htz.pw >   -- gather DB stats
www.htz.pw >   set echo on
www.htz.pw > exec DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER AUTO');

PL/SQL procedure successfully completed.

www.htz.pw > -- cre_db_stat.sql end --
www.htz.pw >         --这里应该是所有的分区都不收集。
www.htz.pw >         start d_stats_ex
www.htz.pw > -- d_stats_ex.sql begin --
www.htz.pw >   -- Query stats
www.htz.pw >   set echo on
www.htz.pw >
www.htz.pw >   select partition_name,sample_size,num_rows,  LAST_ANALYZED
  2     from dba_tab_partitions
  3    where table_owner=user
  4    and table_name='PARTTABLE'
  5    order by partition_name;

PART            SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
--------------- ----------- ---------- -------------------
PARTTABLE_1995          100        100 2015-02-09 11:57:11
PARTTABLE_1996          101        101 2015-02-09 11:57:13
PARTTABLE_1997          110        110 2015-02-09 11:57:13
PARTTABLE_1998           39         39 2015-02-09 11:57:12
PARTTABLE_1999          100        100 2015-02-09 11:57:11

www.htz.pw >
www.htz.pw >   select table_name,sample_size,num_rows,  LAST_ANALYZED
  2    from dba_tables
  3    where owner=user
  4    and table_name='PARTTABLE';

TABLE_NAME                SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
------------------------- ----------- ---------- -------------------
PARTTABLE                         450        450 2015-02-09 11:57:13

www.htz.pw >
www.htz.pw >   select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
  2   , SAMPLE_SIZE, AVG_COL_LEN
  3    from dba_tab_columns
  4    where owner=user
  5    and table_name='PARTTABLE'
  6    order by column_id;

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS LAST_ANALYZED       SAMPLE_SIZE AVG_COL_LEN
------------------------------ ------------ ---------- ---------- ------------------- ----------- -----------
COL1                                    439 .002277904          0 2015-02-09 11:57:13         450           8
COL2                                    268 .003731343          0 2015-02-09 11:57:13         450          11
COL3                                    167 .005988024          0 2015-02-09 11:57:13         450           4

www.htz.pw > -- d_stats_ex.sql end --
www.htz.pw >
www.htz.pw >
www.htz.pw >         --每个分区变化为1,除1998分区
www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

OWNER           TABLE_NAME                PART            SUBPART            INSERTS    UPDATES    DELETES TIMESTAMP           TRUNCATED  DROP_SEGMENTS
--------------- ------------------------- --------------- --------------- ---------- ---------- ---------- ------------------- ---------- -------------
SCOTT           PARTTABLE                                                          4          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1995                           1          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1996                           1          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1997                           1          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1999                           1          0          0 2015-02-09 11:57:13 NO                     0

www.htz.pw >         --向分区分别插入行,总插入行数大于表的10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},其中一个分区的插入行数大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},一个分区不插入数据,其它分区小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}
www.htz.pw >              insert into PARTTABLE select * from (select TO_DATE('01-JAN-1996','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<50);

49 rows created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1997','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<9);

8 rows created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1995','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<9);

8 rows created.

www.htz.pw >         insert into PARTTABLE select * from (select TO_DATE('01-JAN-1999','DD-MON-YYYY')+rownum, rownum+105,rownum*2 from dba_objects where rownum<9);

8 rows created.

www.htz.pw >         commit;

Commit complete.

www.htz.pw >         @table_modification.sql
www.htz.pw > set echo off

Session altered.

exec dbms_stats.flush_database_monitoring_info

OWNER           TABLE_NAME                PART            SUBPART            INSERTS    UPDATES    DELETES TIMESTAMP           TRUNCATED  DROP_SEGMENTS
--------------- ------------------------- --------------- --------------- ---------- ---------- ---------- ------------------- ---------- -------------
SCOTT           PARTTABLE                                                          4          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1995                           1          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1996                           1          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1997                           1          0          0 2015-02-09 11:57:13 NO                     0
SCOTT           PARTTABLE                 PARTTABLE_1999                           1          0          0 2015-02-09 11:57:13 NO                     0

www.htz.pw >         start cre_db_stats
www.htz.pw > -- cre_db_stats.sql begin --
www.htz.pw >   -- gather DB stats
www.htz.pw >   set echo on
www.htz.pw > exec DBMS_STATS.GATHER_DATABASE_STATS(OPTIONS=>'GATHER AUTO');

PL/SQL procedure successfully completed.

www.htz.pw > -- cre_db_stat.sql end --
www.htz.pw >         -- 这里可以发现除1998分区外,表与分区的统计信息都发生了变化。说明当表的更改行大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}的时候,表会更新表的统计信息,并更新有发生了dml操作的分区的统计信息。
www.htz.pw >         start d_stats_ex
www.htz.pw > -- d_stats_ex.sql begin --
www.htz.pw >   -- Query stats
www.htz.pw >   set echo on
www.htz.pw >
www.htz.pw >   select partition_name,sample_size,num_rows,  LAST_ANALYZED
  2     from dba_tab_partitions
  3    where table_owner=user
  4    and table_name='PARTTABLE'
  5    order by partition_name;

PART            SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
--------------- ----------- ---------- -------------------
PARTTABLE_1995          109        109 2015-02-09 11:57:13
PARTTABLE_1996          151        151 2015-02-09 11:57:13
PARTTABLE_1997          119        119 2015-02-09 11:57:13
PARTTABLE_1998           39         39 2015-02-09 11:57:12
PARTTABLE_1999          109        109 2015-02-09 11:57:13

www.htz.pw >
www.htz.pw >   select table_name,sample_size,num_rows,  LAST_ANALYZED
  2    from dba_tables
  3    where owner=user
  4    and table_name='PARTTABLE';

TABLE_NAME                SAMPLE_SIZE   NUM_ROWS LAST_ANALYZED
------------------------- ----------- ---------- -------------------
PARTTABLE                         527        527 2015-02-09 11:57:13

www.htz.pw >
www.htz.pw >   select COLUMN_NAME, NUM_DISTINCT, DENSITY, NUM_NULLS,  LAST_ANALYZED
  2   , SAMPLE_SIZE, AVG_COL_LEN
  3    from dba_tab_columns
  4    where owner=user
  5    and table_name='PARTTABLE'
  6    order by column_id;

COLUMN_NAME                    NUM_DISTINCT    DENSITY  NUM_NULLS LAST_ANALYZED       SAMPLE_SIZE AVG_COL_LEN
------------------------------ ------------ ---------- ---------- ------------------- ----------- -----------
COL1                                    439 .002277904          0 2015-02-09 11:57:13         527           8
COL2                                    316 .003164557          0 2015-02-09 11:57:13         527          10
COL3                                    167 .005988024          0 2015-02-09 11:57:13         527           4

www.htz.pw > -- d_stats_ex.sql end --
www.htz.pw >
www.htz.pw >
www.htz.pw > -- ex_auto_inc1.sql end ---

4,总结

4.1 当表的修改大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}时,不管每个分区更改情况,会收集发生更改的所有分区并更新表的统计信息

4.2 当表的修改小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}时,表分区修改大于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},,会收集所有更改的分区的统计信息,但是不会更新表的统计信息。

4.3 当表的修改小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c}时,分区的修改小于10{ff392285dba4c735eaf57cbf839a563e19e0ca0b993d821097d934f85a596e2c},不会收集所有分区与表的统计信息。

分区表的增量统计信息:自动作业收集:等您坐沙发呢!

发表评论

gravatar

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen

快捷键:Ctrl+Enter