Oracle Database 性能调优 之 数据文件 常见等待事件

============================================================
Oracle Database 性能调优 之 数据文件 常见等待事件
参考:http://blog.csdn.net/tianlesoftware/article/details/5635934
参考:http://blog.csdn.net/tianlesoftware/article/details/5807800
参考:http://blog.csdn.net/tianlesoftware/article/details/4682329
菜小小~@2012_11_22 13:53

============================================================
注:本文为文摘式学习笔记,仅用于个人边整理边学习,许多内容引自文件头部所列出连接,向列位前辈致敬~

Db file scattered read(数据文件离散读取)

事件说明

Db file scattered read是个非常常见的I/O相关的等待事件,通常显示与多个数据块相关的读取操作,当Oracle 需要每次I/O读取多个数据块这样的SQL操作时,会产生这个等待事件。 

最常见的两种情况是全表扫描(FTS: Full Table Scan)和索引快速扫描(IFFS: index fast full scan)的连续读取

注意:这里的scattered指的是读取的数据块在内存中的存放方式,他们被读取到内存中后,是以分散的方式存在在内存中,而不是连续的。

这个名称中的scattered( 发散),可能会导致很多人认为它是以scattered 的方式来读取数据块的,其实恰恰相反,当发生这种等待事件时,SQL的操作都是顺序地读取数据块的,比如FTS或者IFFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。
 

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='db file scattered read';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

db file sequential read      file#      block#     blocks

File#: 代表Oracle要读取的文件的绝对文件号

Block#: Oracle从这个文件中开始读取的起始数据块块号

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视图,可以获得大量有用的信息:

获得全表扫描的对象

Select distinct object_name,object_owner from v$sql_plan p Where p.operation='TABLE ACCESS'and p.options='FULL' and object_owner='SYS';

获得全索引扫描的对象

Select distinct object_name,object_owner from v$sql_plan p Where p.operation='INDEX' and p.options='FULL SCAN' and object_owner='SYS';

通过V$SQL_PLAN和V$SQLTEXT联合,获得全表扫描的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;

Db file sequential read(数据文件顺序读取)

事件说明

Db file sequential read是个非常常见的I/O相关的等待事件,通常显示与单个数据块相关的读取操作,当Oracle 需要每次I/O只读取单个数据块这样的操作时,会产生这个等待事件。 

最常见的情况有索引的访问(除IFFS外的方式),回滚操作,以ROWID的方式访问表中的数据,重建控制文件,对文件头做DUMP等。

注意:这里的sequential并非指的是Oracle 按顺序的方式来访问数据,和db file scattered read一样,它指的是读取的数据块在内存中是以连续的方式存放的。

如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能索引的使用存在问题,并非索引总是最好的选择。

在大多数情况下,通过索引可以更为快速地获取记录,所以对于一个编码规范、调整良好的数据库,这个等待事件很大通常是正常的。但是在很多情况下,使用索引并不是最佳的选择,比如读取较大表中大量的数据,全表扫描可能会明显快于索引扫描,所以在开发中就应该注意,对于这样的查询应该避免使用索引扫描。

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='db file sequential read';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

db file sequential read      file#      block#     blocks

File#: 代表Oracle要读取的文件的绝对文件号

Block#: Oracle从这个文件中开始读取的起始数据块块号

Blocks:要读取的数据块数目(通常这个值为1,表明是单个Block被读取)

Db file parallel read 数据文件并行读

事件说明

这个事件发生在数据库恢复的时候,当有一些数据块需要恢复的时候,Oracle会以并行的方式把他们从数据文件中读入到内存中进行恢复操作。(这个等待事件和并行操作(比如并行查询,并行DML)没有关系)

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='db file parallel read';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

db file parallel read      files      blocks     requests

Files: 操作需要读取的文件个数

Blocks: 操作需要读取的数据块个数

Requests:操作需要执行的I/O次数

Db file parallel write -数据文件并行写 

事件说明

这是一个后台等待事件,它同样和用户的并行操作没有关系,它是由后台进程DBWR产生的,当后台进程DBWR想磁盘上写入脏数据时,会发生这个等待。

DBWR会批量地将脏数据并行地写入到磁盘上相应的数据文件中,在这个批次作业完成之前,DBWR将出现这个等待事件。 如果仅仅是这一个等待事件,对用户的操作并没有太大的影响,当伴随着出现free buffer waits等待事件时,说明此时内存中可用的空间不足,这时候会影响到用户的操作,比如影响到用户将脏数据块读入到内存中。

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='db file parallel write';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

db file parallel write      requests      interrupt     timeout

Requests: 操作需要执行的I/O次数。

Timeouts:等待的超时时间。

事件处理

当出现db file parallel write等待事件时,可以通过启用操作系统的异步I/O的方式来缓解这个等待。 当使用异步I/O时,DBWR不在需要一直等到所有数据块全部写入到磁盘上,它只需要等到这个数据写入到一个百分比之后,就可以继续进行后续的操作。

Db file single write- 数据文件单个写

事件说明

这个等待事件通常只发生在一种情况下,就是Oracle 更新数据文件头信息时(比如发生Checkpoint)。

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='db file single write';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

db file single write      file#      block#     blocks

File#: 需要更新的数据块所在的数据文件的文件号。

Block#:需要更新的数据块号。

Blocks:需要更新的数据块数目(通常来说应该等于1)

事件处理

当这个等待事件很明显时,需要考虑是不是数据库中的数据文件数量太大,导致Oracle 需要花较长的时间来做所有文件头的更新操作(checkpoint)

Direct path read-直接路径读

事件说明

这个等待事件发生在会话将数据块直接读取到PGA当中而不是SGA中的情况,这些被读取的数据通常是这个会话私有的数据,所以不需要放到SGA作为共享数据,因为这样做没有意义。 这些数据通常是来自与临时段上的数据,比如一个会话中SQL的排序数据,并行执行过程中间产生的数据,以及Hash Join,merge join产生的排序数据,因为这些数据只对当前的会话的SQL操作有意义,所以不需要放到SGA当中。

这类读取通常在以下情况被使用:

磁盘排序IO操作

并行查询从属进程

预读操作

当发生direct path read等待事件时,意味着磁盘上有大量的临时数据产生,比如排序,并行执行等操作。 或者意味着PGA中空闲空间不足。

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='direct path read';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

direct path read      file number      first dba     block cnt

First dba: descriptor address 中最旧的一个I/O数据块地址。

Block cnt: descriptor address上下文中涉及的有效的buffer 数量

Direct path write-直接路径写

事件说明

这个等待事件和direct path read 正好相反,是会话将一些数据从PGA中直接写入到磁盘数据文件或临时文件上,而不经过SGA,这种情况通常发生在:

使用临时表空间排序(内存不足)

数据的直接加载(使用append方式加载数据)

并行DML操作

事件参数

这个等待事件有三个参数:

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name='direct path write';

NAME                PARAMETER1 PARAMETER2 PARAMETER3

------------------------------ ---------- ---------- ----------

direct path write      file number      first dba     block cnt

First dba: descriptor address 中最旧的一个I/O数据块地址。

Block cnt: descriptor address上下文中涉及的有效的buffer 数量

事件处理

最常见的直接路径写,多数因为磁盘排序导致。对于这一写入等待,应该找到I/O操作最为频繁的数据文件(如果有过多的排序操作,很有可能就是临时文件),分散负载,加快其写入操作。

如果系统存在过多的磁盘排序,会导致临时表空间操作频繁,对于这种情况,可以考虑为不同用户分配不同的临时表空间,使用多个临时文件,写入不同磁盘或者裸设备,从而降低竞争提高性能。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21162451/viewspace-750040/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21162451/viewspace-750040/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值