Oracle建议您DBMS_STATS.GATHER_SYSTEM_STATS在数据库具有最典型的工作负载时捕获统计信息。
例如,数据库应用程序可以在白天处理OLTP事务,并在晚上生成OLAP报告。
- 关于工作量统计 : 信息工作量统计信息分析指定时间段内的活动。
- 启动和停止系统统计信息收集: 本教程说明如何使用
START和的STOP参数设置工作负载间隔GATHER_SYSTEM_STATS。 - 在指定间隔内收集系统统计信息: 本教程说明如何使用
INTERVAL参数设置工作负载间隔GATHER_SYSTEM_STATS。
13.4.3.2.1关于工作量统计
工作负载统计信息分析指定时间段内的活动。
工作负载统计信息包括表13-4中列出的以下统计信息:
- 单块(
sreadtim)和多块(mreadtim)的读取时间 - 多块计数(
mbrc) - CPU速度(
cpuspeed) - 最大系统吞吐量(
maxthr) - 平均并行执行吞吐量(
slavethr)
数据库单位计算sreadtim,mreadtim以及mbrc通过比较物理顺序的数量和随机的时间从开始到工作负载的末尾两个点之间的读取。数据库通过计数器实现这些值,这些计数器在缓冲区高速缓存完成同步读取请求时会更改。
由于计数器位于缓冲区高速缓存中,因此它们不仅包括I / O延迟,还包括与锁存器争用和任务切换有关的等待。因此,工作负载统计信息取决于工作负载窗口期间的系统活动。如果系统受I / O限制(闩锁争用和I / O吞吐量),那么在数据库使用统计信息后,统计信息会促进I / O密集型计划的减少。
如图13-4所示,如果您收集工作负荷统计信息,那么优化器将使用mbrc为工作负荷统计信息收集的值来估计全表扫描的成本。
图13-4工作负载统计计数器
收集工作负载统计信息时,如果在串行工作负载期间没有进行表扫描,则数据库可能不会收集mbrc和mreadtim值,这是OLTP系统的典型情况。但是,全表扫描在DSS系统上经常发生。这些扫描可以并行运行,并绕过缓冲区高速缓存。在这种情况下,数据库仍会收集数据,sreadtim因为索引查找使用缓冲区高速缓存。
如果数据库无法收集或验证聚集mbrc或mreadtim值,但已经聚集sreadtim和cpuspeed那么只有数据库使用,sreadtim并cpuspeed为成本计算。在这种情况下,优化器使用初始化参数的值DB_FILE_MULTIBLOCK_READ_COUNT来进行全表扫描。但是,如果设置DB_FILE_MULTIBLOCK_READ_COUNT为is 0或not,则优化器使用值8来计算成本。
使用该DBMS_STATS.GATHER_SYSTEM_STATS过程收集工作负载统计信息。该GATHER_SYSTEM_STATS过程将使用经过的时间段的统计信息刷新数据字典或登台表。若要设置收集的持续时间,请使用以下两种技术之一:
- 指定
START工作负载窗口的开头,然后STOP在工作负载窗口的末尾。 - 指定
INTERVAL以及统计信息自动停止之前的分钟数。如果需要,您可以用来GATHER_SYSTEM_STATS (gathering_mode=>'STOP')提前结束计划的收集。
也可以看看:
Oracle数据库参考,了解DB_FILE_MULTIBLOCK_READ_COUNT初始化参数
13.4.3.2.2启动和停止系统统计信息收集
本教程说明了如何使用START和STOP参数设置工作负载间隔GATHER_SYSTEM_STATS。
假设条件
本教程假定以下内容:
- 上午10点至11点之间的时间代表每日的工作量。
- 您打算直接在数据字典中收集系统统计信息。
要使用START和STOP收集工作负载统计信息:
- 启动SQL * Plus,并以管理员权限连接到数据库。
- 开始收集统计信息。
例如,在上午10点,执行以下过程以开始收集:
EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode => 'START' ); - 生成工作量。
- 结束统计信息收集。
例如,在上午11点,执行以下过程以结束收集:
EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode => 'STOP' );现在,优化器可以使用工作负载统计信息来生成在正常的日常工作负载期间有效的执行计划。
- (可选)查询系统统计信息。
例如,运行以下查询:
COL PNAME FORMAT a15 SELECT PNAME, PVAL1 FROM SYS.AUX_STATS$ WHERE SNAME = 'SYSSTATS_MAIN';
也可以看看:
Oracle Database PL / SQL软件包和类型参考以了解该DBMS_STATS.GATHER_SYSTEM_STATS过程
13.4.3.2.3在指定间隔内收集系统统计信息
本教程说明如何使用INTERVAL参数设置工作负载间隔GATHER_SYSTEM_STATS。
假设条件
本教程假定以下内容:
- 数据库应用程序在白天处理OLTP事务,并在晚上运行OLAP报告。为了收集代表性统计数据,您需要在白天收集两个小时,然后在夜间收集两个小时。
- 您要将统计信息存储在名为的表中
workload_stats。 - 您打算在收集的统计信息之间切换。
要使用INTERVAL收集工作量统计信息:
- 启动SQL * Plus并以管理员身份连接到生产数据库
dba1。 - 创建一个表来保存生产统计信息。
例如,执行以下PL / SQL程序以创建用户统计表
workload_stats:BEGIN DBMS_STATS.CREATE_STAT_TABLE ( ownname => 'dba1' , stattab => 'workload_stats' ); END; / - 确保
JOB_QUEUE_PROCESSES不是0这样,以便DBMS_JOB作业和Oracle Scheduler作业运行。ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 1; - 收集白天的统计信息。
例如,使用以下程序收集两个小时的统计信息:
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS ( interval => 120 , stattab => 'workload_stats' , statid => 'OLTP' ); END; / - 晚上收集统计数据。
例如,使用以下程序收集两个小时的统计信息:
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS ( interval => 120 , stattab => 'workload_stats' , statid => 'OLAP' ); END; / - 在白天或晚上,将适当的统计信息导入数据字典。
例如,在白天,您可以使用以下程序将OLTP统计信息从登台表导入字典中:
BEGIN DBMS_STATS.IMPORT_SYSTEM_STATS ( stattab => 'workload_stats' , statid => 'OLTP' ); END; /例如,在晚上,您可以使用以下程序将OLAP统计信息从登台表导入到字典中:
BEGIN DBMS_STATS.IMPORT_SYSTEM_STATS ( stattab => 'workload_stats' , statid => 'OLAP' ); END; /
也可以看看:
Oracle Database PL / SQL软件包和类型参考以了解该DBMS_STATS.GATHER_SYSTEM_STATS过程




