Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

5

积分

1

好友

8

主题
1#
发表于 2013-3-9 18:12:35 | 查看: 6648| 回复: 2
   请问一下,PHYSICAL READS 与DISK_READS的区别?

  问题描述:
    RAC的一个实例 node2 系统的%wio比较高,高峰期在45%左右,node1则只有15%左右。
    现做如下分析:

1.通过查看dba_hist_sysstat 统计这个时间段的 physical reads信息。

SQL> SELECT snap_id,sum(decode(stat_name, 'physical reads', value, 0)) -
  2         lag(sum(decode(stat_name, 'physical reads', value, 0)), 1) over(order by snap_id) "physical reads"
  3    FROM SYS.dba_hist_sysstat
  4   WHERE DBID = (SELECT DBID FROM SYS.V_$DATABASE)
  5     AND INSTANCE_NUMBER = (SELECT INSTANCE_NUMBER FROM SYS.V_$INSTANCE)
  6     AND (SELECT MIN(SNAP_ID)
  7            FROM SYS.DBA_HIST_SNAPSHOT
  8           WHERE END_INTERVAL_TIME >= TRUNC(SYSDATE - 1) + 9 / 24) < SNAP_ID
  9     AND SNAP_ID <=
10         (SELECT MAX(SNAP_ID)
11            FROM DBA_HIST_SNAPSHOT
12           WHERE END_INTERVAL_TIME <= TRUNC(SYSDATE - 1) + 11 / 24 + 10 / 1440)
13     and stat_name = 'physical reads'
14   group by snap_id;

   SNAP_ID physical reads
---------- --------------
     64606
     64607       13213270   --node2结果
   64608       15534898
     64609       12254055

   SNAP_ID physical reads
---------- --------------
     64606
     64607        7396706   --node1结果
   64608        9671272
     64609        7604288

从结果可以得知,node2的物理读明显要高于node1

2.通过查看DBA_HIST_SQLSTAT统计SQL的DISK READ信息
SQL> SELECT snap_id,
  2         sum(DISK_READS_DELTA) "DISK_READS"
  3    FROM SYS.DBA_HIST_SQLSTAT t
  4   WHERE DBID = (SELECT DBID FROM SYS.V_$DATABASE)
  5     AND INSTANCE_NUMBER = (SELECT INSTANCE_NUMBER FROM SYS.V_$INSTANCE)
  6     AND (SELECT MIN(SNAP_ID)
  7            FROM SYS.DBA_HIST_SNAPSHOT
  8           WHERE END_INTERVAL_TIME >= TRUNC(SYSDATE - 1) + 9 / 24) < SNAP_ID
  9     AND SNAP_ID <=
10         (SELECT MAX(SNAP_ID)
11            FROM DBA_HIST_SNAPSHOT
12           WHERE END_INTERVAL_TIME <= TRUNC(SYSDATE - 1) + 11 / 24 + 10 / 1440)
13   group by snap_id;


   SNAP_ID DISK_READS
---------- ----------
     64606 7394590 --node2结果
   64607 7011258
     64608 7021596
     64609 4705304

SNAP_ID DISK_READS
---------- ----------
    64606 6952370  --node1结果
  64607 7344260
    64608 7526567
    64609 6593402
从这个结果分析,两个节点的disk read并不明显。且与dba_hist_sysstat的统计结果相差很大。

我的理解是:DBA_HIST_SQLSTAT记录的SQL信息,当snapshot在30分钟采样的过程中,node2由于share pool不够,导致一些不常用SQL被踢出,因此没有被snapshot捕获到DBA_HIST_SQLSTAT,所以造成了查看DBA_HIST_SQLSTAT 中的 disk read的值,node2与node1 不明显的原因,且node2的disk read比 physical read少很多原因。

请老大们帮忙看看是不是这个原因呢,谢谢啦。
2#
发表于 2013-3-9 22:14:42
1. AWR、V$都未必是100%精确的

2. 总的来说 dba_hist_sysstat 比 DBA_HIST_SQLSTAT  更适合反应总体的 活动指标

3.  试试下面这个脚本
  1. alter session set nls_date_format='dd-mon-yy';
  2. set lines 160 pages 1000 echo off feedback off
  3. col stat_name for a25
  4. col date_time for a40
  5. col BEGIN_INTERVAL_TIME for a20
  6. col END_INTERVAL_TIME for a20
  7. prompt "Enter the date in DD-Mon-YY Format and Stats you want to trend like 'redo size','physical reads','physical writes','session logical reads' etc."

  8. WITH sysstat AS
  9. (select sn.begin_interval_time begin_interval_time,
  10.          sn.end_interval_time end_interval_time,
  11.          ss.stat_name stat_name,
  12.          ss.value e_value,
  13.          lag(ss.value, 1) over(order by ss.snap_id) b_value
  14.     from dba_hist_sysstat ss, dba_hist_snapshot sn
  15.    where trunc(sn.begin_interval_time) >= sysdate-7
  16.      and ss.snap_id = sn.snap_id
  17.      and ss.dbid = sn.dbid
  18.      and ss.instance_number = sn.instance_number
  19.      and ss.dbid = (select dbid from v$database)
  20.      and ss.instance_number = (select instance_number from v$instance)
  21.      and ss.stat_name = 'physical reads')
  22. select to_char(BEGIN_INTERVAL_TIME, 'mm/dd/yy_hh24_mi') || to_char(END_INTERVAL_TIME, '_hh24_mi') date_time,
  23. stat_name,
  24. round((e_value - nvl(b_value,0)) / (extract(day from(end_interval_time - begin_interval_time)) * 24 * 60 * 60
  25. + extract(hour from(end_interval_time - begin_interval_time)) * 60 * 60
  26. + extract(minute from(end_interval_time - begin_interval_time)) * 60 + extract(second from(end_interval_time - begin_interval_time))),0) per_sec
  27. from sysstat where(e_value - nvl(b_value,0)) > 0 and nvl(b_value,0) > 0
  28. /
复制代码

回复 只看该作者 道具 举报

3#
发表于 2013-3-10 00:44:21
非常感谢刘大!
最终的原因是采集的粒度不一样,dba_hist_sysstat采集的全局的 physical reads,而DBA_HIST_SQLSTAT采集的是v$sql 在share pool中的每个SQL的信息,当SQL被踢出后,计算就存在很大的偏差了。同样,如果存在dba_hist_sesstat表(或者手工去定时采集v$sesstat)然后计算physical reads的话,统计的结果一样不准确。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-11-16 08:48 , Processed in 0.074575 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569