技术开发 频道

点评Oracle 11g新特性之统计信息收集


4. 延迟发布统计信息
    缺省情况下,11g之前,数据库每次在收集统计信息以后,都会将统计信息存放在数据字典里。只要它们写入了数据字典,优化器就会看到它们,从而在下次生成执行计划的时候就会参考当前最新的统计信息。但是有时候,你可能并不希望收集完最新的统计信息以后立即发布。而是先对最新的统计信息进行测试,如果测试下来发现性能没有损失,才正式发布出去,从而让优化器看到。11g以后,你可以这么去做了。

    在11g里,你可以将发布统计信息这一步从收集统计信息的过程中剥离出来。也就是先收集统计信息,然后再发布出去。这样就可以让DBA有机会先在测试环境里验证新的统计信息对性能所带来的影响。

    如果你想延迟发布统计信息,则将收集统计信息的选项PUBLISH设置为FALSE,然后收集统计信息,这时统计信息就会存放在私有数据字典表里,可以从ALL|DBA|USER}_{TAB|COL|IND|TAB_HISTGRM}_PRIVATE_STATS里看到这些私有的统计信息。

    为了测试这些私有统计信息,你可以有两种方法:
    1) 第一种方式使用DBMS_STAT.EXPORT_PRIVATE_STATS存储过程将私有统计信息转移到你自己的统计信息表(可以使用存储过程DBMS_STATS.CREATE_STAT_TABLE来创建你自己的统计信息表)里。然后可以使用expdp导出你的统计信息表,然后再使用impdp将导出文件导入到测试环境中,再使用DBMS_STAT.IMPORT_TABLE_STATS将其导入到测试环境中进行测试。

   2) 第二种方式不导出私有的统计信息,而是直接在产品库的session级别,将11g引入的新的初始化参数:  OPTIMIZER_PRIVATE_STATISTICS设置为TRUE(缺省情况下该参数为FALSE)。这时你执行SQL时,优化器就会参考私有统计信息来解析SQL语句并生成执行计划了。

    最后,测试完毕,发现最新的统计信息没有问题的话,你就可以使用DBMS_STAT.PUBLISH_PRIVATE_STATS在产品库上将私用统计信息发布出去,从而让优化器能够看到它们。

    下面列举一个例子来简单说明这个过程。首先设置表级别的publish选项为false:
    exec dbms_stats.set_table_prefs('Schema_name','Table_name','PUBLISH','false');

    然后,收集表的统计信息:
    exec dbms_stats.gather_table_stats('Schema_name','Table_name');

    第三,设置相关初始化参数:
    alter session set optimizer_use_private_statistics = true;

    第四,进行测试,运行相关的SQL语句,并检查产生的执行计划。
最后,把该表的统计信息发布出去:
exec dbms_stats.publish_private_stats('Schema_name','Table_name');

0
相关文章