Oracle分区表中global_stats=YES global_stats=FALSE影响查询效率

select GLOBAL_STATS from user_indexes where index_name=index_name;
LOBAL_STATS:
>对于分区表,指示是否收集了统计信息
>是针对整个表(YES)还是从统计信息中估计的
>基础分区和子分区(NO)

 

分区表里global_stats=YES的全局统计信息是否准确关系到optimizer能否选择较优的执行计划,对分区表执行全局统计会不可避免的产生FTS加重系统负担,尤其对于DW环境里规模较大的分区表而言更是如此。

 

global_stats这个代表该分区表是否对该分区进行了统计分析,一般情况下,系统在不知道什么时候都会对这分区就行统计分析的。而对这个分区进行统计分析又包含了两种方式,非incremental方式,incremental方式,而非incremental方式会进行全量扫描分区表中所有的分区incremental方式则会增量扫描分区表中的分区。

 

incremental statistics collect正是在这一背景下应运而生,简单的说incremental statistics collect会实时记录分区表里每个partition每列值的更新情况,这一信息保存在SYSAUX表空间里,后续根据这一信息在执行全局统计时仅会针对有变化的partition进行statistics collect,并将收集的结果与没有变化过的partition原有的统计信息进行整合,计算出准确的global stats,省去了必须去扫描每一个partition的步骤。

 

非incremental方式新加分区后对整个分区表收集统计信息,会全量扫描分区表中所有的分区,即使那些没有改变过的分区也会被重新扫描一遍

 

//查看分区表下有多少个分区

select table_name,count(*)  from dba_tab_partitions group by table_name order by 2 desc;

 

//查看该表统计偏好

select dbms_stats.get_prefs('granularity','system','SALES') from dual;

 

//查看分析后global与partition级的统计信息

select num_rows,blocks,last_analyzed from dba_tables where table_name='SALES';

 

//重新收集global统计 

exec DBMS_STATS.gather_table_stats(ownname=>'SYSTEM',tabname => 'SALES');

posted @ 2020-09-12 22:55  nbako555  阅读(1049)  评论(0编辑  收藏  举报