您的位置:首页 > 数据库 > Oracle

ORACLE DBMS_STATS统计信息 11g新特性:Pending Statistics

2016-04-15 08:39 423 查看
从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');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: