對於分區表,優化器會在全局級別為整個表維護一份統計信息,也會在分區級別為分區表維護一份統計信息。 對於大多數分區,dml一般都是在最近的分區上執行。在11g中,數據庫支持只對那些發生一定數據變化的分區收集統計信息(默認的threshold是分區的10%的行)
11g之前,數據庫為了獲得global統計信息,必須掃描整個表。而在11g中,數據庫可以增量維護global統計信息,通過僅掃描那些有一定比例數據發生變化的分區,其他分區仍然使用老的統計信息。
分區表的增量統計信息不會增量維護直方圖。
使用dbms_stat包指定分區表的分析粒度(auto、global、global and partition、all、partition、subpartition)。 如果將粒度設置為global並且將表標記為incremental的,數據庫在增量的基礎上收集全局統計信息。數據庫也會對發生改變的分區進行自動收集統計信息。
Oracle will update the global table statistics by scanning only the partitions that have been changed instead of the entire table if the following conditions hold: •INCREMENTAL value for the partitioned table is set to TRUE; •PUBLISH value for the partitioned table is set to TRUE; •User specifies AUTO_SAMPLE_SIZE for ESTIMATE_PERCENT and AUTO for GRANULARITY when gathering statistics on the table
begin dbms_stats.set_table_prefs( 'SCOTT','DEPT','INCREMENTAL','TRUE'); end; / 現在,您應該專門收集此表中粒度為 AUTO的分區 DEPT_01 上的統計信息。 begin dbms_stats.gather_table_stats ( ownname => 'SCOTT', tabname => 'DEPT', partname => 'DEPT_01', granularity => 'AUTO' ); end;
