Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
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)
 
 
 
 
posted on 2009-01-19 21:50 decode360 阅读(124) 评论(0)  编辑  收藏 所属分类: 10.DB_Tools

只有注册用户登录后才能发表评论。


网站导航: