2011-10-20 58 views
3

我使用DBMS_STATS.GATHER_SCHEMA_STATS過程來收集我的代碼中的統計信息。DBMS_STATS會分析表嗎?

BEGIN 
    DBMS_STATS.gather_schema_stats 
          (ownname   => '<SCHEMA NAME', 
          estimate_percent => DBMS_STATS.auto_sample_size, 
          options   => 'GATHER STALE', 
          DEGREE   => NULL, 
          CASCADE   => DBMS_STATS.auto_cascade, 
          granularity  => 'auto' 
          ); 
end; 

我的問題:後,我這段代碼執行時,我檢查使用TOAD刀具表的最後分析的日期和它顯示了當我跑了DBMS_STATS.GATHER_SCHEMA_STATS程序等一些過去的日期,而不是當前的日期。

這是否意味着DBMS_STATS不會分析表?

回答

8

當您指定選項GATHER STALE時,您告訴Oracle您只想收集自上次統計信息收集到該對象後發生「重大」更改的對象的統計信息。如果Oracle自上次收集統計數據後確定該表沒有太大變化,則不會再收集統計信息。

Oracle通過監視這些表上的DML(11g中的默認監視器表 - 您必須在早期版本中啓用監視)來確定表格發生了顯着變化。該數據定期寫入DBA_TAB_MODIFICATIONS(大約每幾個小時)。當DBMS_STATSGATHER STALE選項一起運行時,Oracle會將DBA_TAB_MODIFICATIONS中的大致更改數與該表的先前統計信息進行比較,以確定是否有足夠的行進行了更改以使其重新收集統計信息值得。