从12c开始,数据库能针对批量加载的操作自动的进行在线统计信息的收集:

1)CREATE TABLE AS SELECT

2)INSERT INTO … SELECT 使用直接路径加载的方式插入到一个空表

在12C之前,我们针对大的数据量进行加载后,考虑到新能的原因都需要针对表再进行统计信息的收集,

这仍然是费时费力的操作。这个特性的引入,在我们进行数据加载的同时进行了统计信息的收集,避免

了不必要的表的二次扫描,同时也不需要再次人为的收集统计信息。

下面通过一些测试对这个特性加以澄清:

1)test1  以CREATE TABLE…AS SELECT..方式进行批量加载

create table big_table
as
select * from dba_objects;

alter session set nls_date_format=’yyyy/mm/dd hh24:mi:ss’;

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;
OWNER    TABLE_NAME   PARTITION_NAME   PARTITION_POSITION SUBPARTITION_NAME    SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ———— —————- —————— ——————– ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                   TABLE             92715       1589            0          0          0         115                         0                   0                                             92715 2016/08/31 14:48:20 YES          NO                         NO          SHARED  

select * from dba_tab_col_statistics where owner=’SKYDL’ and table_name=’BIG_TABLE’;

OWNER       TABLE_NAME     COLUMN_NAME         NUM_DISTINCT LOW_VALUE                                                        HIGH_VALUE                                                 DENSITY  NUM_NULLS NUM_BUCKETS LAST_ANALYZED       SAMPLE_SIZE GLOBAL_STATS USER_STATS NOTES              AVG_COL_LEN HISTOGRAM       SCOPE
———– ————– ——————- ———— —————————————————————- ——————————————————- ———- ———- ———– ——————- ———– ———— ———- —————— ———– ————— ——-
SKYDL       BIG_TABLE      ORACLE_MAINTAINED              2 4E                                                               59                                                              .5          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      EDITIONABLE                    2 4E                                                               59                                                              .5      41933           1 2016/08/31 14:48:20       50782 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      SHARING                        3 4D45544144415441204C494E4B                                       4F424A454354204C494E4B                                  .333333333          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD               14 NONE            SHARED  
SKYDL       BIG_TABLE      EDITION_NAME                   0                                                                                                                                   0      92715           0 2016/08/31 14:48:20             YES          NO         STATS_ON_LOAD                0 NONE            SHARED  
SKYDL       BIG_TABLE      NAMESPACE                     24 C102                                                             C15E                                                    .0416666667          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                3 NONE            SHARED  
SKYDL       BIG_TABLE      SECONDARY                      2 4E                                                               59                                                              .5          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      GENERATED                      2 4E                                                               59                                                              .5          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      TEMPORARY                      2 4E                                                               59                                                              .5          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      STATUS                         1 56414C4944                                                       56414C4944                                                       1          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                6 NONE            SHARED  
SKYDL       BIG_TABLE      TIMESTAMP                   1197 313939302D30382D32363A31313A32353A3030                           323031362D30382D33313A31343A34383A3139                  .000835421888          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD               20 NONE            SHARED  
SKYDL       BIG_TABLE      LAST_DDL_TIME               1163 78660A010D2A32                                                   7874081F0F3114                                          .000859845228          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                8 NONE            SHARED  
SKYDL       BIG_TABLE      CREATED                     1049 78720707062802                                                   7874081F0F3114                                          .000953288847          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                8 NONE            SHARED  
SKYDL       BIG_TABLE      OBJECT_TYPE                   46 434C5553544552                                                   584D4C20534348454D41                                    .0217391304          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                9 NONE            SHARED  
SKYDL       BIG_TABLE      DATA_OBJECT_ID              8641 80                                                               C30A3511                                                .000115727346      83972           1 2016/08/31 14:48:20        8743 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      OBJECT_ID                  92715 C103                                                             C30A3511                                                .0000107857413          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                5 NONE            SHARED  
SKYDL       BIG_TABLE      SUBOBJECT_NAME               344 2456534E5F31                                                     57524D245F5044425F494E5F534E41505F4D5844425F4D58534E    .00290697674      91925           1 2016/08/31 14:48:20         790 YES          NO         STATS_ON_LOAD                2 NONE            SHARED  
SKYDL       BIG_TABLE      OBJECT_NAME                54484 2F31303030333233645F44656C6567617465496E766F636174696F6E4861     794362437253756253616D706C696E67547970653230305F54      .0000183540122          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD               25 NONE            SHARED  
SKYDL       BIG_TABLE      OWNER                         35 415045585F303430323030                                           584442                                                  .0285714286          0           1 2016/08/31 14:48:20       92715 YES          NO         STATS_ON_LOAD                6 NONE            SHARED  

 选定了 18 行

+注意DBA_TAB_COL_STATISTICS.NOTES 字段因为批量加载被设置为STATS_ON_LOAD

2) test2 以INSERT INTO … SELECT..方式进行批量加载

drop table big_table;

create table big_table
as
select * from dba_objects
where 1=0;

–正如test1,统计信息会被收集
select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;
OWNER    TABLE_NAME     PARTITION_NAME    PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ————– —————– —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                     TABLE                 0          0            0          0          0           0                         0                   0                                                 0 2016/08/31 15:11:09 YES          NO                         NO          SHARED  

–加载到一个空表
insert into big_table
select * from dba_objects;
92,715 行已插入。

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;
OWNER    TABLE_NAME     PARTITION_NAME    PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ————– —————– —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                     TABLE                 0          0            0          0          0           0                         0                   0                                                 0 2016/08/31 15:11:09 YES          NO                         NO          SHARED  

+应为没有走direct path insert,因此没有统计信息被收集

truncate table big_table;

+追加hint /*+append*/,确保direct path insert
insert /*+append*/ into big_table
select * from dba_objects;
92,715 行已插入。

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;
OWNER    TABLE_NAME   PARTITION_NAME    PARTITION_POSITION SUBPARTITION_NAME    SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ———— —————– —————— ——————– ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                    TABLE             92715          0            0          0          0         115                         0                   0                                             92715 2016/08/31 15:15:24 YES          NO                         NO          SHARED  

+INSERT INTO … SELECT 插入到一个空表且使用 direct path insert的时候统计信息才会被收集

+注意:BLOCKS仍然是0

3) test3  commit和再次插入的影响

drop table big_table;

create table big_table
as
select * from dba_objects
where 1=0;

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;

OWNER    TABLE_NAME    PARTITION_NAME   PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ————- —————- —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                   TABLE                 0          0            0          0          0           0                         0                   0                                                 0 2016/08/31 15:27:50 YES          NO                         NO          SHARED  

insert /*+append*/ into big_table
select * from dba_objects;
92,718 行已插入。

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;
OWNER   TABLE_NAME    PARTITION_NAME   PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——- ————- —————- —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL   BIG_TABLE                                                                                   TABLE             92718          0            0          0          0         115                         0                   0                                             92718 2016/08/31 15:28:25 YES          NO                         NO          SHARED  

commit;

OWNER    TABLE_NAME   PARTITION_NAME    PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ———— —————– —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                   TABLE             92718       1589            0          0          0         115                         0                   0                                             92718 2016/08/31 15:29:04 NO           NO                         NO          SHARED  

+在commit之后,’BLOCKS’ 和 ‘LAST_ANALYZED’ 和 ‘GLOBAL_STATS’的值才会改变

–再次插入
insert /*+append*/ into big_table
select * from dba_objects;
92,718 行已插入。

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE’;
OWNER    TABLE_NAME   PARTITION_NAME    PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED       GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——– ———— —————– —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ——————- ———— ———- ————— ———– ——-
SKYDL    BIG_TABLE                                                                                   TABLE             92718       1589            0          0          0         115                         0                   0                                             92718 2016/08/31 15:29:04 NO           NO                         NO          SHARED  

+现在表不为空,再次以direct path插入这个表并不会收集统计再次

+这是期望的结果,因为表并不为空


4) test 4  hint NO_GATHER_OPTIMIZER_STATISTICS


–假如您不想在批量加载的时候收集统计信息,可以追加hintNO_GATHER_OPTIMIZER_STATISTICS

CREATE TABLE big_table2 AS
SELECT /*+NO_GATHER_OPTIMIZER_STATISTICS */* FROM dba_objects;

select * from  DBA_TAB_STATISTICS where owner=’SKYDL’ and table_name=’BIG_TABLE2′;
OWNER     TABLE_NAME     PARTITION_NAME    PARTITION_POSITION SUBPARTITION_NAME   SUBPARTITION_POSITION OBJECT_TYPE    NUM_ROWS     BLOCKS EMPTY_BLOCKS  AVG_SPACE  CHAIN_CNT AVG_ROW_LEN AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS AVG_CACHED_BLOCKS AVG_CACHE_HIT_RATIO SAMPLE_SIZE LAST_ANALYZED GLOBAL_STATS USER_STATS STATTYPE_LOCKED STALE_STATS SCOPE
——— ————– —————– —————— ——————- ——————— ———— ———- ———- ———— ———- ———- ———– ————————- ——————- —————– ——————- ———– ————- ———— ———- ————— ———– ——-
SKYDL     BIG_TABLE2                                                                                    TABLE                                                                                                                                                                                           NO           NO                                     SHARED