db file sequential read等待事件

最近某个应用的AWR中总显示“db file sequential read“等待事件位于top 5之首,下面检索下MOS关于这个等待事件的说明。

等待事件: "db file sequential read" Reference Note (文档 ID 34559.1)

        这种等待事件是一种IO读请求相关的等待。与”db file scattered read“不同,因为”sequential read“是将数据读到连续的内存(注意:这里指的是读到相连的内存,不是说读取的是连续的数据块。同时一次”scattered read“可以读多个块,将他们分散到SGA的不同buffer)。这一事件通常显示与单个数据块相关的读取操作(如索引读取)。如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,可能没有正确的使用驱动表;或者可能说明不加选择地进行索引。

        一次”sequential read“通常是单块读,尽管可能看到对于多个块的”sequential read“(见后面的描述)。这种等待也可能在数据文件头读取中看到(P2=1表明是读取文件头)。

独立的等待:

参数:

    P1 = file#
    P2 = block#
    P3 = blocks

file#   指的是Oracle正在读取的文件file#。Oracle8/9中file#是绝对文件号。

block#  指的是Oracle正在读取的块号。一次只能读取一个块。

blocks  这个参数明确了Oracle正在从file#的block#开始读取的块数。通常是”1“,但如果P3>1,那么这就是一次多块读。当从SORT(TEMPORARY)段读取数据时,多块的”db file sequential read“可以在更早的Oracle版本中看到。

等待时间:

IO通常是指对操作系统的一次IO请求-直到IO请求完成的等待的块。当Oracle对操作系统的读请求可以从操作系统文件系统的缓存中得到时,等待时间会非常小。

系统级等待:

        IO是一种正常的活动,所以真正关心的是那些不必要的或明显缓慢的IO活动。如果花费在IO上的时间非常大,那么我们能够判断哪部分segement段,Oracle是需要从磁盘中获取的。可以查看ESTAT或STATSPACK报告中"Tablespace IO"和"File IO"节,可以得到一些关于哪些表空间/文件正在用于大部分IO请求,得到IO子系统处理速度的指标。如果花费在等待读的时间非常大,那么找出Oracle正在读哪些segment段是非常有帮助的。可以找到哪些文件正在被读。

        找出哪些session正在读,并且通过trace跟踪他们来看IO是否正常,也是对此类等待事件的判断是有帮助的。下面的SQL可以找出哪些session值得跟踪:

SELECT sid, total_waits, time_waited
FROM v$session_event

WHERE event='db file sequential read' and total_waits>0 ORDER BY 3,2;

也可以改下上面的语句:

找出高磁盘读取的session(”DISK_READS“)

找出高物理读的session("physical reads")

降低等待次数和时间:

        块的读取往往是无法避免的,所以为了降低等待时间,目标就是最小化不必要的IO。为了达到此目的,就需要良好的应用设计和有效的执行计划。执行计划的改变能够对性能产生非常大的影响。系统级的微小调整通常收货甚微。下面几点可能有用:

(1)、查找使用未加以选择的索引范围(index scan)扫描的SQL。

(2)、更大的buffer cache也许有帮助-需要通过真实增加buffer cache来测试,而不是使用DB_BLOCK_LRU_EXTENDED_STATISTICS参数,(如果有可能导致额外的系统换页,那么就不能增加SGA大小)。

(3)、还有一些不太明显的问题可能影响IO,将数据进行物理聚类的程度如何。例如,假设频繁地从一个表中获取行数据,该表中一列是通过索引范围(index scan)扫描的方式得到两个值。如果这里每个索引块中有100行数据,那么有两个极端:

1. 每行数据都在不同的物理数据块(每个索引块包含的100行数据需要读取100个块)。

2. 所有数据都分配到极少的几个相邻物理数据块(每个索引块只需要读取少量的块)。

预先排序或重组数据可以帮助解决这种极端情况。

1. 分区是否能够用来降低需要读取的数据块数量。

2. 找到引起磁盘中频繁的索引范围(index scan)的文件,将它缓存到操作系统文件系统的缓存中。这样将会允许Oracle读请求可以从操作系统缓存中获得,而不是从磁盘IO中获得。

时间: 2024-08-31 00:23:07

db file sequential read等待事件的相关文章

详解 db file sequential read 等待事件

db file sequential read (本文由thomaswoo_dba翻译,转载请注明出处) db file sequential read 事件有三个参数:file#,first block#, block count, 在oracle 10g里,此等待事件在归于 User I/O wait class 下面的. 处理db file sequential read 事件要牢牢把握下面三个主要思想: 1)oracle 进程需要访问的block不能从SGA 中获取,因此oracle 进

db file sequential read 详解

db file sequential read (本文由thomaswoo_dba翻译,转载请注明出处) db file sequential read 事件有三个参数:file#,first block#, block count, 在oracle 10g里,此等待事件在归于 User I/O wait class 下面的. 处理db file sequential read 事件要牢牢把握下面三个主要思想:1)oracle 进程需要访问的block不能从SGA 中获取,因此oracle 进程

db file sequential read及优化

db file sequential read:直接路径读:   官方说明如下: This event signifies that the user process is reading a buffer into the SGA buffer cache and is waiting for a physical I/O call to return. A sequential read is a single-block read. Single block I/Os are usuall

Resolving Issues Where Application Queries are Waiting Too Frequently for 'db file sequential read'

昨天有篇"db file sequential read"的介绍,还有一篇类似的:Resolving Issues Where Application Queries are Waiting Too Frequently for 'db file sequential read' Operations (文档 ID 1475825.1) 诊断"db file sequential read"的步骤: 简述: 低效的SQL会引起不同节点间非常多的块读. 问题确认: 花

High Waits on 'Db File Sequential Read' Due to Table Lookup Following Index Access

最近某些系统AWR的top 5中"Db File Sequential Read"占据的时间百分比非常大,通常这种等待事件是一种正常的.但当前系统性能是有些问题的,并发量大,有些缓慢,因此需要判断这种等待事件是否能够减少.MOS有几篇关于这种等待事件的介绍,这是其中一篇. High Waits on 'Db File Sequential Read' Due to Table Lookup Following Index Access (文档 ID 875472.1) 即使执行计划已经

常识之外:全表扫描为何产生大量 db file sequential read 单块读?

原创 2016-07-05 熊军 Oracle   编辑手记:在理解Oracle技术细节时,我们不仅应该读懂概念,还要能够通过测试验证细节,理解那些『功夫在诗外』的部分,例如全表扫描和单块读. 开发人员在进行新系统上线前的数据校验测试时,发现一条手工执行的 SQL 执行了超过1小时还没有返回结果.SQL 很简单: 下面是这条 SQL 的真实的执行计划: 很显然,在这个表上建 billing_nbr 和 start_date 的复合索引,这条 SQL 就能很快执行完(实际上最后也建了索引).但是这

[20130409]Data file init write等待事件.txt

[20130409]Data file init write等待事件.txt 清明前几天帮别人解决数据库问题,就是高峰的时候有点慢. 仔细看awr报表,除了发现几条sql语句没有建立索引外,发现等待事件里Data file init write.很明显主要数据文件next设置太小,当我看数据文件发现next竟然是8k,将它修改128M后问题消失. 我自己感到奇怪的是无论如何前面的安装人员都不应该把next设置为8k(难道是笔误应该是8M还有可能). 今天自己在11G上做一个测试,原来问题在于建立

解决db file sequential read与db file scattered read

1.根据收集的等待事件,分析是那些对象以及对应的sql. 2.确定是那些对象,执行如下: SELECT segment_name, partition_name, p1, p2 FROM dba_extents, wait1 WHERE wait1.p2 BETWEEN block_id AND (block_id + blocks - 1) AND file_id = wait1.p1ORDER BY segment_name 3.确定执行的sql语句,执行如下: SELECT hash_va

【等待事件】等待事件系列(1)--User I/O类型

[等待事件]等待事件系列(1)--User I/O类型 1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ①  等待事件系列(1)--User I/O类型     Tips: ① 本文在ITpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaim