Statspack学习(三).脚本分析
statspack最关键的部分,就是脚本的分析了。怎么得到数据简单,但是要知道数据是什么意思,就比较困那了,需要对Oracle运行机制的深入了解,和丰富的实际操作经验,总之我是没有了,所以我只是看大牛的文章学习。
一、重要的脚本
1、通过导出保存及共享数据
有时需要将原始数据导出后,请教专业人士进行分析,可以使用spuexp.par,内容如下:
file=spuexp.dmp log=spuexp.log compress=y grants=y indexes=y rows=y constraints=y owner=PERFSTAT consistent=y
使用一下脚本进行导出:
SQL> host exp userid=perfstat/perfstat parfile=E:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\spuexp.par
... ...
成功终止导出, 没有出现警告。
在当前目录下生成spuexp.dmp文件。
2、删除数据脚本
用于删除数据的spdrop.sql脚本主要调用了spdtab.sql和spdusr.sql两个脚本
spdtab.sql用于删除表和同义词
spdusr.sql用于删除用户
二、调整Statspack收集选项
Statspack有两种类型的收集选项:级别(level)、门限(threshold)
1、级别(level)
一共分为三个级别,分别是0、5、10,默认是5。
① level 0:一般性统计。包括等待事件、系统事件、系统统计、回滚段统计、行缓存、SGA、会话锁、缓冲池统计等
② level 5:增加SQL语句。SQL语句收集结果放在stats$sql_summary中
③ level 10:增加子锁存统计。将附加子锁存入stats$lathc_children中(本级别建议在oracle support指导下进行)
修改方式:
① SQL> execute statspack.snap(i_snap_level=>0,modify_parameter=>'true'); --以后都修改
② SQL> execute statspack.snap(i_snap_level=>10); --只修改本次
2、快照门限
门限只用于stats$sql_summary表中获取的SQL语句。由于每个快照都会收集很多数据,每一行都代表获取快照时数据库中的一个SQL语句,因此stats$sql_summary很快就会成为Statspack中最大的表,所以需要加门限进行限制。
executions_th:SQL语句执行的数量(默认值100)
disk_reads_th:SQL语句执行的磁盘读入数(默认值1000)
parse_calls_th:SQL语句执行的解析调用数量(默认值1000)
buffer_gets_th:SQL语句执行的缓冲区获取的数量(默认值10000)
任何一个门限值超过以上参数就会产生一条记录。
使用一下脚本修改门限的默认值:
SQL> execute statspack.modify_statspack_parameter(i_buffer_gets_th=>100000,i_disk_reads_th=>100000);
三、整理分析结果
Statspack进行快照采集之后,会在stats$sysstat表中,针对每个snap生成N行数据,每一行表示当前某一项参数的值,具体的参数代码及名称可以使用以下脚本查询:
SQL> select distinct statistic#,name from stats$sysstat order by 1;
statistic# name
---------- ------------------------------------
0 logons cumulative
1 logons current
2 opened cursors cumulative
3 opened cursors current
4 user commits
... ...
1、物理读写IO操作:
select sn.snap_id,
to_char(snap_time, 'hh24:mi:ss') sp_time,
(newreads.value - oldreads.value) reads,
(newwrites.value - oldwrites.value) writes
from stats$sysstat oldreads,
stats$sysstat newreads,
stats$sysstat oldwrites,
stats$sysstat newwrites,
stats$snapshot sn
where newreads.snap_id = sn.snap_id
and newwrites.snap_id = sn.snap_id
and oldreads.snap_id = sn.snap_id - 1
and oldwrites.snap_id = sn.snap_id - 1
and oldreads.statistic# = 37
and newreads.statistic# = 37
and oldwrites.statistic# = 40
and newwrites.statistic# = 40
and (newreads.value - oldreads.value) > 0
and (newwrites.value - oldwrites.value) > 0;
该SQL表述了在各个时间段中的IO物理读和IO物理写的数量,可用于分析各个时间段的峰值以及平均IO量,以减少竞争。
2、Buffer命中率:
select sn.snap_id,
to_char(snap_time, 'hh24:mi:ss') sp_time,
round(100 *
((a.value - d.value) + (b.value - e.value) - (c.value - f.value))
/ ((a.value - d.value) + (b.value - e.value))) "Buffer Hit Ratio"
from stats$sysstat a,
stats$sysstat b,
stats$sysstat c,
stats$sysstat d,
stats$sysstat e,
stats$sysstat f,
stats$snapshot sn
where a.snap_id = sn.snap_id
and b.snap_id = sn.snap_id
and c.snap_id = sn.snap_id
and d.snap_id = sn.snap_id - 1
and e.snap_id = sn.snap_id - 1
and f.snap_id = sn.snap_id - 1
and a.statistic# = 47
and d.statistic# = 47
and b.statistic# = 50
and e.statistic# = 50
and c.statistic# = 54
and f.statistic# = 54;
注:Buffer Hit Ratio = (db block gets + consistent gets - physical reads) / (db block gets + consistent gets)