点评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
相关文章
- Perl 5.22 发布覃里 · 2015-06-05
- Tom Kyte大神解析Oracle 12c新版本特性覃里 · 2014-11-20
- 谷歌夏日情怀:细数谷歌十大火热新特性王冠 · 2011-09-12
- CUDA 4.0新特性预览董建伟 · 2011-03-01
- MySQL 5.5新特性详解覃里 · 2010-08-04
- Java 7新I/O特性解析覃里 · 2010-05-05
- MySQL 5.1.40新特性及下载覃里 · 2009-10-21
- Exchange 2010服务器端六项展示新功能胡铭娅 · 2009-09-30
- 微软展示Windows 7针对企业用户的新特性和技术亮点胡铭娅 · 2009-09-27
- Silverlight 3 影音支持新特性胡铭娅 · 2009-09-21