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

你可能感兴趣的:(oracle,dbms_stats)