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

时间:2023-03-08 17:44:15

转载:http://www.dbtan.com/2010/04/db-file-sequential-read.html

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

db file sequential read是个非常常见的I/O相关的等待事件,通常显示与单个数据块相关的读取操作,在大多数的情况下,读取一个索引块或者通过索引读取一个数据块时,都会记录这个等待。

这个等待事件有3个参数P1,P2,P3,其中P1代表Oracle要读取的文件的绝对文件号,P2代表Oracle从这个文件中开始读取的起始数据块号,P3代表读取的BLOCK数量,通常这个值为1,表明是道单个BLOCK被读取。

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

在Oracle 10g/11g中,这个等待事件被归入User I/0一类

sys@CCDB> select name,wait_class
  2  from v$event_name
  3  where name = 'db file sequential read';
NAME                           WAIT_CLASS        
------------------------------ ------------------
db file sequential read        User I/O

下图简要说明了单块读取的操作方式:

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

如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,没有正确地使用驱动表;或者可能索引的使用存在问题,并非索引总是最好的选择。在大多数情况下,通过索引可以更为快速地获取记录,所以对于编码规范、调整良好的数据库,这个等待事件很大通常是正常的。有时候这个等待过高和存储分布不连续、连续数据块中部分被缓存有关,特别对于DML频繁的数据表,数据以及存储空间的不连续可能导致过量的单块读,定期的数据整理和空间回收有时候是必须的。

需要注意在很多情况下,使用索引并不是最佳的选择,比如读取较大表中大量的数据,全表扫描可能会明显快于索引扫描,所以在开发中就应该注意,对于这样的查询应该进行避免使用索引扫描。

从Oracle 9iR2开始,Oracle引入了段级统计信息收集的新特性,可以通过查询v$segment_statistics视图,找出物理读显著的索引段或者是表段,研究其数据结构,看能否通过重建或者重新划分分区、存储参数等手段降低I/O访问。

Oracle 9iR2中,收集的统计信息共有11类:

SQL> select * from v$segstat_name; 
STATISTIC# NAME                                     SAMPLED 
---------- ---------------------------------------- --------- 
         0 logical reads                            YES 
         1 buffer busy waits                        NO 
         2 db block changes                         YES 
         3 physical reads                           NO 
         4 physical writes                          NO 
         5 physical reads direct                    NO 
         6 physical writes direct                   NO 
         8 global cache cr blocks served            NO 
         9 global cache current blocks served       NO 
        10 ITL waits                                NO 
        11 row lock waits                           NO 
11 rows selected.

在Oracle 10gR2/11gR1中,这类统计信息增加为15个:

sys@CCDB> select * from v$segstat_name;
STATISTIC# NAME                                SAM
---------- ----------------------------------- ---
         0 logical reads                       YES
         1 buffer busy waits                   NO
         2 gc buffer busy                      NO
         3 db block changes                    YES
         4 physical reads                      NO
         5 physical writes                     NO
         6 physical reads direct               NO
         7 physical writes direct              NO
         9 gc cr blocks received               NO
        10 gc current blocks received          NO
        11 ITL waits                           NO
        12 row lock waits                      NO
        14 space used                          NO
        15 space allocated                     NO
        17 segment scans                       NO
15 rows selected.

对于CBO模式下的数据库,应当及时收集统计信息,使SQL可以选择正确的执行计划,避免因为统计信息的陈旧而导致执行错误等。