作者: 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的总裁。