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');