作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


db file scattered read 等待事件:

我们经常会见到db file scattered read等待事件,在生产环境中,这个等待事件可能更为常见。这个事件表明用户进程正在读数据到Buffer Cache中,等待直到I/O调用返回。db file scattered read发出离散读,将存储上连接的数据块离散的读入到多个不连续的内存位置。Scattered Read通常是多块读,在Full Table Scan或Fast Full Scan等访问方式下使用

Scattered Read代表Full Scan,当执行Full Scan读取数据到Buffer Cache时,通常连续的数据在内存中的存储位置并不连续,所以这个等待被命名为Scattered Read(离散读)。每次多块读读取的数据块数量受初始化参数DB_FILE_MULTIBLOCK_READ_COUNT限制。下图简要说明了Scattered Read的数据读取方式。

Scattered Read的数据读取

从v$event_name视图可以看到,该等待有3个参数,分别代表文件号、起始数据块号、数据块的数量:

sys@CCDB> select event#,name,parameter1,parameter2,parameter3
  2  from v$event_name
  3  where name = 'db file scattered read';
    EVENT# NAME                           PARAMETER1   PARAMETER2   PARAMETER3
---------- ------------------------------ ------------ ------------ ------------
       132 db file scattered read         file#        block#       blocks

数据文件号、起始数据号加上数据块的数量,通过这些信息可以知道Oracle Session正在等待的对象文件等信息。该等待可能和全表扫描(Full Table Scan)或者快速全索引扫描(Index Fast Full Scan)的连续读取相关,根据经验,通常大量的db file scattered read等待可能意味着应用问题或者索引缺失。

在实际环境的诊断过程中,可以通过v$session_wait视图发现session的等待,再结合其他视图找到存在问题的SQL等根本原因,从而从根本上解决问题。

当这个等待事件比较显著时,用户也可以结合v$session_longops动态性能视图来进行诊断,该视图中记录了长时间(运行时间超过6秒的)运行的事务,可能很多是全表扫描操作(不管怎样,这部分信息都是值得我们注意的)。

从Oracle 9i开始,Oracle新增加了一个视图v$sql_plan用于记录当前系统Library Cache中SQL语句的执行计划,可以通过这个视图找到存在问题的SQL语句。

可以过程v$sql_plan和v$sqltext联合,获得这些查询的SQL语句,查找全表扫描的SQL语句可以参考如下语句:

select sql_text
from v$sqltext t,v$sql_plan p
where t.hash_value = p.hash_value
  and p.operation = 'TABLE ACCESS'
  and p.options = 'FULL'
order by p.hash_value,t.piece;

查找Fast Full Index扫描的SQL语句可以参考如下语句:

select sql_text
from v$sqltext t, v$sql_plan p
where t.hash_value = p.hash_value
  and p.operation = 'INDEX'
  and p.options = 'FULL SCAN'
order by p.hash_value, t.piece;

这些信息对于发现数据库问题,优化数据库性能具有极强的指导意义。

在Oracle 10g中,Oracle对等待事件进行了分类,db file scattered read事件被归入User I/O一类

sys@CCDB> select name,parameter1 p1,parameter2 p2,parameter3 p3,
  2  wait_class_id,wait_class#,wait_class                 
  3  from v$event_name                                    
  4  where name = 'db file scattered read';
NAME                      P1         P2         P3         WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS
------------------------- ---------- ---------- ---------- ------------- ----------- ------------
db file scattered read    file#      block#     blocks        1740759767           8 User I/O

完成对等待事件的分类之后,Oracle 10g的ADDM可以很容易地通过故障分析定位到问题所在,帮助用户快速发现数据库的瓶颈及瓶颈的根源,这就是Oracle的ADDM专家系统的设计思想。

通过下图可以直观清晰地看到这个等待模型和ADDM结合实现的Oracle专家诊断系统。

Oracle专家诊断系统

- The End -