11g新特性--pending statistics

lsq_008發表於2013-01-26
在11gr2後,收集統計資訊後,可以選擇使用或不使用新的統計資訊,如果使用新的統計資訊,則統計資訊被儲存在USER_TAB_STATISTICS 和 USER_IND_STATISTICS.中
如果不使用,則統計資訊被儲存在USER_TAB_PENDING_STATS 和 USER_IND_PENDING_STATS中

使用如下方法檢視是否使用新的統計資訊:
SQL> SELECT DBMS_STATS.GET_PREFS('PUBLISH') PUBLISH FROM DUAL;

PUBLISH
--------------------------------------------------------------------------------
TRUE

使用如下儲存過程,可以修改預設的釋出方式:
Exec dbms_stats.set_table_prefs('HR', 'TEST', 'PUBLISH', 'false');


測試如下:
SQL> exec dbms_stats.gather_table_stats(user,'test');

PL/SQL procedure successfully completed.

SQL> select table_name,LAST_ANALYZED from user_tab_statistics where table_name='TEST';

TABLE_NAME                     LAST_ANALYZED
------------------------------ -------------------
TEST                           2012-12-25 09:44:18

SQL> Exec dbms_stats.set_table_prefs('HR', 'TEST', 'PUBLISH', 'false');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats(user,'test');

PL/SQL procedure successfully completed.

SQL> select table_name,LAST_ANALYZED from user_tab_statistics where table_name='TEST';

TABLE_NAME                     LAST_ANALYZED
------------------------------ -------------------
TEST                           2012-12-25 09:44:18

--可見,再次收集統計資訊後,last_analyzed時間沒有發生變化

SQL> Exec dbms_stats.set_table_prefs('HR', 'TEST', 'PUBLISH', 'true');

PL/SQL procedure successfully completed.

SQL> exec dbms_stats.gather_table_stats(user,'test');

PL/SQL procedure successfully completed.

SQL> select table_name,LAST_ANALYZED from user_tab_statistics where table_name='TEST';

TABLE_NAME                     LAST_ANALYZED
------------------------------ -------------------
TEST                           2012-12-25 09:47:50

--修改publish為true後,再次執行統計資訊收集,last_analyzed已經被更新

--如果需要使用未publish的統計資訊,需要修改optimizer_use_pending_statistics引數為true


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

相關文章