在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博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-753395/
,如需转载,请注明出处,否则将追究法律责任。