oracle系统统计信息

系统统计信息主要描述了与系统硬件相关的某些特性,例如cpu和io系统的性能和利用率等。这些信息对于查询优化器来说是非常重要的,在选择执行计划的过程中,oracle优化器会利用系统统计信息来评估执行计划的成本,因此,准确无误的系统统计信息可以帮助优化器做出正确的选择。

我们可以通过DBMS_STATS.GATHER_SYSTEM_STATS过程来收集系统统计信息,收集的方式有两种:负载统计(WORKLOAD STATISTICS)在具有真实系统负载的数据库系统上,收集某一时间段内的系统信息;非负载统计(NOWORKLOAD STATISTICS)oracle数据库基于某种方式(如持续读磁盘)模拟系统负载来获取系统统计信息。

通各方资料和oracle官方文档中可以看出,我们最好采用系统负载的方式来收集系统统计信息,收集的时间间隔至少要30分钟,条件允许的情况下,最好多次收集,择优使用。处理使用DBMS_STATS.GATHER_SYSTEM_STATS来收集系统统计信息,我们也可以手工设定某些信息选项,这一点在后面会有示例。

oracle的系统统计信息最终是存储在aux_stats$数据基表中的,首先来看一下该表的结构:

SQL> desc aux_stats$
 名称			       是否为空? 类型
 ----------------------------- -------- --------------------
 SNAME			       NOT NULL VARCHAR2(30)
 PNAME			       NOT NULL VARCHAR2(30)
 PVAL1					NUMBER
 PVAL2					VARCHAR2(255)
aux_stats$表中存储的数据量是非常有限的,如

SQL> select * from aux_stats$;

SNAME		     PNAME		       PVAL1 PVAL2
-------------------- -------------------- ---------- ------------------------------
SYSSTATS_INFO	     STATUS			     COMPLETED
SYSSTATS_INFO	     DSTART			     09-17-2011 10:21
SYSSTATS_INFO	     DSTOP			     09-17-2011 10:21
SYSSTATS_INFO	     FLAGS			   1
SYSSTATS_MAIN	     CPUSPEEDNW 	  1751.75879
SYSSTATS_MAIN	     IOSEEKTIM			  10
SYSSTATS_MAIN	     IOTFRSPEED 		4096
SYSSTATS_MAIN	     SREADTIM
SYSSTATS_MAIN	     MREADTIM
SYSSTATS_MAIN	     CPUSPEED
SYSSTATS_MAIN	     MBRC

SNAME		     PNAME		       PVAL1 PVAL2
-------------------- -------------------- ---------- ------------------------------
SYSSTATS_MAIN	     MAXTHR
SYSSTATS_MAIN	     SLAVETHR

已选择13行。
sname字段的取值有:SYSSTATS_INFO,SYSSTATS_MAIN,SYSSTATS_TEMP

SYSSTATS_INFO:系统统计信息的状态

SYSSTATS_MAIN:系统统计信息的内容

SYSSTATS_TEMP:在收集系统统计信息期间,用于临时存放中间数据

对于pname字段的含义,oracle官方文档给出了详细的解释:

Parameter NameDescriptionInitializationOptions for Gathering or Setting StatisticsUnit

cpuspeedNW

Represents noworkload CPU speed. CPU speed is the average number of CPU cycles in each second. CPU速率

At system startup

Set gathering_mode = NOWORKLOAD or set statistics manually.

Millions/sec.

ioseektim

I/O seek time equals seek time + latency time + operating system overhead time. 寻道时间

At system startup

10 (default)

Set gathering_mode = NOWORKLOAD or set statistics manually.

ms

iotfrspeed

I/O transfer speed is the rate at which an Oracle database can read data in the single read request. 数据传输速率

At system startup

4096 (default)

Set gathering_mode = NOWORKLOAD or set statistics manually.

Bytes/ms

cpuspeed

Represents workload CPU speed. CPU speed is the average number of CPU cycles in each second. CPU速率

None

Set gathering_mode = NOWORKLOADINTERVAL, orSTART|STOP, or set statistics manually.

Millions/sec.

maxthr

Maximum I/O throughput is the maximum throughput that the I/O subsystem can deliver. 输入输出最大吞吐量

None

Set gathering_mode = NOWORKLOADINTERVAL, orSTART|STOP, or set statistics manually.

Bytes/sec.

slavethr

Slave I/O throughput is the average parallel slave I/O throughput. 从属进程的平均吞吐量

None

Set gathering_mode = INTERVAL or START|STOP, or set statistics manually.

Bytes/sec.

sreadtim

Single block read time is the average time to read a single block randomly. 单块读时间

None

Set gathering_mode = INTERVAL or START|STOP, or set statistics manually.

ms

mreadtim

Multiblock read is the average time to read a multiblock sequentially. 多块读时间

None

Set gathering_mode = INTERVAL or START|STOP, or set statistics manually.

ms

mbrc

Multiblock count is the average multiblock read count sequentially. 一次多块读的数据库块数量

None

Set gathering_mode = INTERVAL or START|STOP, or set statistics manually.

blocks



有一点需要注意:在新版本的oracle(10g)中,非工作量统计信息总是可用的,如果不存在非工作量统计信息,会在实例初始化时自动收集。

当我们更新系统统计信息后,oracle并不会讲已解析的sql语句置为无效,但是新的sql会使用信息系统统计信息。


我们先来看一下非工作量统计信息

非工作量统计信息包括IO TRASFER SPEED, IO SEEK TIME 和CPU SPEED,即上表中的蓝色标识区域。

非工作量统计信息是在系统空闲时段收集的,它通过随机读取所有的数据文件来测试系统IO性能并测试CPU的速度。在默认情况下,oracle使用非工作量统计信息,但是如果我们收集了工作量统计信息,oracle就会优先使用工作量统计信息。

oracle会在第一次启动时自动收集非工作量统计信息,如果我们需要手工收集非工作量统计信息,可以使用不带参数的DBMS_sTATS.GATHER_SYSTEM_STATS过程。收集非工作量统计信息会对系统产生负载,其运行时间的长短也依赖于数据库服务器的性能。由于oracle内部的检测机制,非工作量统计信息的收集可能不会覆盖默认值,这时我们可以多试几次或者手工来设定统计信息。


我们再来看一下工作量统计信息

工作量统计信息包括单块读时间和多块读时间,mbrc等,即上表中红色标识区域。

oracle在收集工作量统计信息时,不会对数据库系统造成额外的系统负载,因为oracle是通过查询统计时间段内的统计信息如v$sysstat v$sesstat等来得到工作量系统统计信息的。

oracle计算工作量统计信息是通过某些计数器来实现的,这些计数器只有在oracle buffer cach完成某些操作时才会改变,因此这些计数器不仅反映了磁盘输入输出的延迟,同时也反应了与latch和任务转换相关的等待事件。由此我们可以推断出,如果一个系统的瓶颈在io系统,那么oracle在根据工作量统计信息生成执行计划时,会优先选择对io依赖较小的执行计划。

我们可以通过如下两种方式来收集工作量系统统计信息

  • Run the DBMS_STATS.GATHER_SYSTEM_STATS('start') procedure at the beginning of the workload window, then the DBMS_STATS.GATHER_SYSTEM_STATS('stop')procedure at the end of the workload window.

  • Run DBMS_STATS.GATHER_SYSTEM_STATS('interval', interval=>N) where N is the number of minutes when statistics gathering is stopped automatically.

当我们收集工作量统计信息时,oracle会收集MBRC的值,但是如果在收集时间段内,oracle没有能过收集到mbrc和MREADTIM的值(如,在时间段内没有发生串行化的全表扫描操作),在这种情况下,oracle会使用初始化参数DB_FILE_MULTIBLOCK_READ_COUNT来评估全表扫描的成本,如果该初始化参数没有指定,那么oracle会使用8来代替。关于DB_FILE_MULTIBLOCK_READ_COUNT,我会专门来介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值