|
从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。 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');
|