Oracle等待事件之04(Db file scattered/sequential read)

  1. 查看oracle 版本信息
[oracle@xag182 ~]$ sql admin/[email protected]:1521/pdb1

SQL> set sqlformat ansiconsole

SQL> select * from v$version;
BANNER                                                                        CON_ID  
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production  0       
PL/SQL Release 12.2.0.1.0 - Production                                        0       
CORE    12.2.0.1.0  Production                                                0       
TNS for Linux: Version 12.2.0.1.0 - Production                                0       
NLSRTL Version 12.2.0.1.0 - Production                                        0 
  1. Db file scattered read
这个等待事件在实际生产库中经常可以看到,这是一个用户操作引起的等待事件,当用户发出每次I/O需要读取多个数据块这样的SQL 操作时,
会产生这个等待事件,最常见的两种情况是全表扫描(FTS: Full Table Scan)和索引快速扫描(IFFS: index fast full scan)。
这个名称中的scattered( 分散),可能会导致很多人认为它是以scattered 的方式来读取数据块的,其实恰恰相反,当发生这种等待事件时,
SQL的操作都是顺序地读取数据块的,比如FTS或者IFFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。
这里的scattered指的是读取的数据块在内存中的存放方式,他们被读取到内存中后,是以分散的方式存在在内存中,而不是连续的。
这个等待事件有三个参数:
File#: 要读取的数据块所在数据文件的文件号。
Block#: 要读取的起始数据块号。
Blocks: 需要读取的数据块数目。

  1. 測試Db file scattered read場景
create table t4 
as 
select rownum row_no, 
rpad('M',9,'A') ca
from dual connect by level<=100000;

SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event  where upper(event) like 'DB FILE%';
EVENT                    TOTAL_WAITS  AVERAGE_WAIT  
db file sequential read  18638        1.34          
db file scattered read   1193         2.1 ------------------------          
db file single write     12           0.17          
db file parallel read    8            8.54 

SQL> select * from t4;
ROW_NO  CA         
1            MAAAAAAAA  
    ...
100000       MAAAAAAAA

SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event  where upper(event) like 'DB FILE%';
EVENT                    TOTAL_WAITS  AVERAGE_WAIT  
db file sequential read  18638        1.34          
db file scattered read   1211         2.06  -----------------------------        
db file single write     12           0.17          
db file parallel read    8            8.54 
oracle在执行FTS时也进行Single Block I/O。这时即便是FTS也会发生db file sequential read等待。
    FTS上使用Single Block I/O或读取比MBRC值小的块数的情况如下:
(1)达到区的界线时:如一个区有9个块,一次Multi Block I/O读取8个块,则一次以Multi Block I/O读取之后的剩余一个块通过
     Single Block I/O读取,如果剩下的块有两个,就会执行Multi Block I/O,而且只读取两个块。
(2)扫描过程中读取被缓存的块时:如读取8个块时,其中第三个块被缓存,oracle将前两个块通过Multi Block I/O读取,
     对于第三个块执行一次Logical I/O,剩下的5个块通过Multi Block I/O读取。这种情况经常发生时,因引发多次的I/O,
     可能成为FTS速度下降的原因。

(3)存在行链接时:在执行FTS的过程中,如果发现了行链接,oracle为了读取剩下的行引起的附加I/O,此时执行Single Block I/O。

SQL> show parameter mult
NAME                          TYPE    VALUE 
----------------------------- ------- ----- 
db_file_multiblock_read_count integer 128 
parallel_adaptive_multi_user boolean FALSE

SQL> select OWNER,SEGMENT_NAME ,SEGMENT_TYPE,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents 
     where segment_name='T4' AND owner='ADMIN';

OWNER  SEGMENT_NAME  SEGMENT_TYPE  EXTENT_ID  BLOCK_ID  BLOCKS  
ADMIN  T4            TABLE         0          336       8       
ADMIN  T4            TABLE         1          344       8       
ADMIN  T4            TABLE         2          352       8       
ADMIN  T4            TABLE         3          360       8       
ADMIN  T4            TABLE         4          368       8       
ADMIN  T4            TABLE         5          376       8       
ADMIN  T4            TABLE         6          640       8       
ADMIN  T4            TABLE         7          648       8       
ADMIN  T4            TABLE         8          656       8       
ADMIN  T4            TABLE         9          664       8       
ADMIN  T4            TABLE         10         672       8       
ADMIN  T4            TABLE         11         680       8       
ADMIN  T4            TABLE         12         688       8       
ADMIN  T4            TABLE         13         696       8       
ADMIN  T4            TABLE         14         704       8       
ADMIN  T4            TABLE         15         712       8       
ADMIN  T4            TABLE         16         512       128     
ADMIN  T4            TABLE         17         768       128 
  1. Db file sequential read
这个等待事件在实际生产库也很常见,当Oracle 需要每次I/O只读取单个数据块这样的操作时,会产生这个等待事件。
最常见的情况有索引的访问(除IFFS外的方式),回滚操作,以ROWID的方式访问表中的数据,重建控制文件,对文件头做DUMP等。
这里的sequential也并非指的是Oracle 按顺序的方式来访问数据,和db file scattered read一样,
它指的是读取的数据块在内存中是以连续的方式存放的。
这个等待事件有三个参数:
File#: 要读取的数据块锁在数据文件的文件号。
Block#: 要读取的起始数据块号。
Blocks: 要读取的数据块数目(这里应该等于1)。
  1. 測試 Db file sequential read 場景
SQL> alter system flush buffer_cache;

SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event where upper(event) like 'DB FILE%';
EVENT                    TOTAL_WAITS  AVERAGE_WAIT  
db file sequential read  19030        1.32          
db file scattered read   1216         2.06          
db file single write     12           0.17          
db file parallel read    8            8.54

create index ind_t4_01 on t4(row_no);

select * from t4 where row_no=1000;

SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event where upper(event) like 'DB FILE%';
EVENT                    TOTAL_WAITS  AVERAGE_WAIT  
db file sequential read  23455        1.12          
db file scattered read   1731         1.73          
db file single write     12           0.17          
db file parallel read    17           6.67 

  1. 数据文件关于Multi Block I/O和Single Block I/O的活动信息:
SQL> select f.file#,f.name,s.phyrds,s.phyblkrd,s.readtim,s.singleblkrds,s.singleblkrdtim,
       (s.phyblkrd - s.singleblkrds) as multiblkrd,
       (s.readtim - s.singleblkrdtim) as multiblkrdtim,
       round(s.singleblkrdtim /decode(s.singleblkrds, 0, 1, s.singleblkrds),3) as singleblk_avgtim,
       round((s.readtim - s.singleblkrdtim)/nullif((s.phyblkrd - s.singleblkrds), 0),3) as multiblk_avgtim
       from v$filestat s, v$datafile f
       where s.file# = f.file#;

FILE#  NAME                                       PHYRDS  PHYBLKRD  READTIM  SINGLEBLKRDS  SINGLEBLKRDTIM  MULTIBLKRD  MULTIBLKRDTIM  SINGLEBLK_AVGTIM  MULTIBLK_AVGTIM  
9      /u02/oradata/MPAPEX/pdb1/system01.dbf      7605    19537     21867    6750          20024           12787       1843           2.967             0.144            
10     /u02/oradata/MPAPEX/pdb1/sysaux01.dbf      12080   22635     5731     11345         4815            11290       916            0.424             0.081            
11     /u02/oradata/MPAPEX/pdb1/undotbs01.dbf     55      55        214      55            214             0           0              3.891                              
17     /u02/oradata/MPAPEX/pdb1/PDB1_UD1.dbf      91      606       253      39            183             567         70             4.692             0.123            
18     /u02/oradata/MPAPEX/pdb1/PDB1_UD2.dbf      151     638       535      125           420             513         115            3.36              0.224            
19     /u02/oradata/MPAPEX/pdb1/I_PDB1_UD1.dbf    1       1         0        1             0               0           0              0                                  
20     /u02/oradata/MPAPEX/pdb1/I_PDB1_UD2.dbf    1       1         0        1             0               0           0              0                                  
21     /u02/oradata/MPAPEX/pdb1/apex182.dbf       4864    4968      720      4803          680             165         40             0.142             0.242            
22     /u02/oradata/MPAPEX/pdb1/apex182_file.dbf  5       9         12       4             10              5           2              2.5               0.4              
23     /u02/oradata/MPAPEX/pdb1/ords183.dbf       103     103       7        103           7               0           0              0.068                              
24     /u02/oradata/MPAPEX/pdb1/apextb.dbf        308     308       45       308           45              0           0              0.146                              
25     /u02/oradata/MPAPEX/pdb1/apextb2.dbf       1       1         0        1             0               0           0              0      


SQL> select f.file#,f.name,s.phyrds,s.phyblkrd,s.readtim, --所有的读取工作信息  
           s.singleblkrds,s.singleblkrdtim, --Single Block I/O  
           (s.phyblkrd - s.singleblkrds) as multiblkrd, --Multi Block I/O次数  
           (s.readtim - s.singleblkrdtim) as multiblkrdtim, --Multi Block I/O时间  
           round(s.singleblkrdtim / decode(s.singleblkrds, 0, 1, s.singleblkrds),3) as singleblk_avgtim, --Single Block I/O 平均等待时间(cs)  
           round((s.readtim - s.singleblkrdtim)/nullif((s.phyblkrd - s.singleblkrds), 0),3) as multiblk_avgtim --Multi Block I/O 平均等待时间(cs)  
        from v$filestat s, v$datafile f  
        where s.file# = f.file#;
FILE#  NAME                                       PHYRDS  PHYBLKRD  READTIM  SINGLEBLKRDS  SINGLEBLKRDTIM  MULTIBLKRD  MULTIBLKRDTIM  SINGLEBLK_AVGTIM  MULTIBLK_AVGTIM  
9      /u02/oradata/MPAPEX/pdb1/system01.dbf      7605    19537     21867    6750          20024           12787       1843           2.967             0.144            
10     /u02/oradata/MPAPEX/pdb1/sysaux01.dbf      12080   22635     5731     11345         4815            11290       916            0.424             0.081            
11     /u02/oradata/MPAPEX/pdb1/undotbs01.dbf     55      55        214      55            214             0           0              3.891                              
17     /u02/oradata/MPAPEX/pdb1/PDB1_UD1.dbf      91      606       253      39            183             567         70             4.692             0.123            
18     /u02/oradata/MPAPEX/pdb1/PDB1_UD2.dbf      151     638       535      125           420             513         115            3.36              0.224            
19     /u02/oradata/MPAPEX/pdb1/I_PDB1_UD1.dbf    1       1         0        1             0               0           0              0                                  
20     /u02/oradata/MPAPEX/pdb1/I_PDB1_UD2.dbf    1       1         0        1             0               0           0              0                                  
21     /u02/oradata/MPAPEX/pdb1/apex182.dbf       4864    4968      720      4803          680             165         40             0.142             0.242            
22     /u02/oradata/MPAPEX/pdb1/apex182_file.dbf  5       9         12       4             10              5           2              2.5               0.4              
23     /u02/oradata/MPAPEX/pdb1/ords183.dbf       103     103       7        103           7               0           0              0.068                              
24     /u02/oradata/MPAPEX/pdb1/apextb.dbf        308     308       45       308           45              0           0              0.146                              
25     /u02/oradata/MPAPEX/pdb1/apextb2.dbf       1       1         0        1             0               0           0              0  

你可能感兴趣的:(Oracle等待事件之04(Db file scattered/sequential read))