作者: Builder.com 在9i中,Oracle增强了SQL的基于开销的优化器(CBO),从而在决定SQL语句的最优执行计划时采用I/O和CPU使用率统计信息。
Oracle使用新的Oracle9i DBMS_STATS包来收集这些信息。然而,这个包的功能非常有限,而且因为大多数系统有多种操作模式,所以说在考虑Oracle收集系统统计信息的时候你必须格外小心。 典型地,假如选择使用DBMS_STATS,最好的办法是在数据库进行某种类型的处理时进行采样。例如,假设我们有一个白天运行于OLTP模式下而晚上运行于决策支持系统(DSS)模式下的数据库。 在下面的例子中,白天Oracle在运行于OLTP模式下时收集统计信息;而在晚上,Oracle在运行批处理操作时收集统计信息。 -- Create the table to hold the stats dbms_Stats.Create_Stat_Table ( ownname => 'PROD', stattab => 'dbastats', tblspace => 'perfstat'); -- Run during the day; gather stats for when the system is in OLTP mode BEGIN dbms_Stats.Gather_System_Stats( interval => 300, stattab => 'dbastats', statid => 'OLTP'); END; / -- Start at night to gather stats during batch operations BEGIN Dbms_Stats.Gather_System_Stats( interval => 300, stattab => 'mystats', statid => 'DSS'); END; / 在已经收集了系统统计信息的采样之后,我们就可以在系统改变处理模式的时候动态地切换系统统计。 execdbms_stats.import_system_stats('dbastats','OLTP'); exec dbms_stats.import_system_stats('dbastats','BATCH'); 当然,这个特性对于双峰Oracle数据库来说是很基本的,因为对于这种数据库的处理特点变化很大。而对于查询模式恒定的均匀型数据库来说,这个特性与你自己的查询执行计划区别不大。 --------------------------------------------------- 本文作者: Donald Burleson是有23年经验的数据库治理员,他出版过14本数据库专著,发表论文达100多篇。Donald Burleson是Oracle Internals的主编和Burleson Oracle Consulting的总裁。
|