11g新特性:Pending Statistics

hurp_oracle發表於2016-08-25

從11g開始,表與索引的統計資訊收集完畢後,可以選擇收集的統資訊立即釋出,也可以選擇使新收集的統計資訊 處於pending狀態,待確定處於pending狀態的統計資訊是安全的,再使處於pending狀態的統計資訊釋出,這樣就會避免一些因為收集統計信 息立即釋出而導致SQL執行計劃走錯的災難。

[@more@]1 如何判斷是否有pending的統計資訊需要生效?
SQL> Select dbms_stats.get_prefs('PUBLISH') publish from dual;
PUBLISH
--------------------------
TRUE
dbms_stats的get_prefs函式返回true,表示物件的統計資訊收集後立即生效,如果返回flase,收集的統計資訊將處於pending狀態。
2 如果檢視相關的檢視
A 立即生效的統計資訊可以透過以下字典可以檢視
user_tab_stats
user_ind_stats
B pending狀態的統計資訊可以透過以下字典可以檢視
user_tab_pending_stats
user_ind_pending_stats
3 如何設定表或schema的統計資訊的publish狀態
用 dbms_stats的set_table_prefs或者set_schema_prefs過程可以在表級或schema表設定它們的統計資訊是否立即 生效,當我們設定tmp_test表的統計資訊收集後處於pending狀態,那該表收集統計資訊後,將存放於 user_tab_pending_stats字典中。
SQL> Exec dbms_stats.set_table_prefs('yekai','tmp_test','publish','false');
PL/SQL procedure successfully completed.
SQL> select count(*) from user_tab_pending_stats;
COUNT(*)
----------
0
SQL> exec dbms_stats.gather_table_stats('yekai','tmp_test');
PL/SQL procedure successfully completed.
SQL> select count(*) from user_tab_pending_stats;
COUNT(*)
----------
1
4 如何測試並使用處於pending狀態的統計資訊
在 11g,新的引數optimizer_pending_statistics將可以來解決這個問題,當我們在session級設定 optimizer_pending_statistics為true時,我們就可以使用存放在user_*_pending_stats字典中的統計信 息啦,當我們確保該處於pending狀態的統計資訊是正確時,我們就可以決定是否使它們立即生效。
SQL> alter session set optimizer_pending_statistics = TRUE;
5 如何釋出處於pending狀態的統計資訊
當測試過統計資訊有效後,我們可以選擇釋出pending狀態的統計資訊
SQL> exec dbms_stats.publish_pending_stats('yekai','tmp_test');
如果我們不需要該處於pending狀態的統計資訊,可以選擇刪除這個pending的統計資訊
SQL> exec dbms_stats.publish_pending_stats('yekai','tmp_test');

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29446986/viewspace-2124002/,如需轉載,請註明出處,否則將追究法律責任。

相關文章