ORACLE DBMS_STATS統計信息 11g新特性:Pending Statistics

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章