用户请求的数据不在Oracle的高速缓冲区的时候,服务器进程将相应的数据文件中的数据块加载到高速缓冲区。即称为常规路径(Conventional Path)I/O。常规路径I/O分为多块(Multi Block)I/O和单块(Single Block)I/O。多块I/O可一次读取多个连续的块的I/O方式,单块I/O每次只能读取一个块的I/O方式。 Oracle在执行全表扫描(Full Table Scan。FTS)或快速全索引扫描(Index Fast Full Scan)的时候,为了保证性能尽可能执行将多个连续的块的一次性读取的多块I/O。每次执行多块I/O的时候,直等到物理I/O的结束为止,发生db file scattered read等待事件。 多块I/O是参照DB_FILE_MULTIBLOCKREAD_COUNT参数所指定的值执行。这个值的最大值随OS不同而最大值也不尽相同,可通过以下方法查看最大值。 Oracle在执行FTS的时候,有时也进行单块I/O。这时候就算FTS,也会发生db file sequential read的等待。在FTS中,使用单块I/O或者读取比MBRC小的块的情况如下。 达到区(Extent)界限的时候:假设一个区有9个块,而一次多块I/O可读取8个块,那么剩下的一个块由单块I/O来读取。如果剩下的块是2个块,那么执行多块I/O来读取且只读2个块。 扫描过程中如发现缓存(Cache)的块时:假设在读取8个块的时候,其中第三个块已经缓存,那么Oracle将前面的两个块以多块IO读取,而对第三个块则执行一次逻辑(Logical)IO,再将剩下的5个块以多块IO来读取。如果这种情况经常发生,可引发不必要的IO,进而成为降低FTS速度原因。 有链接行(Chained Row)的情况: 在执行FTS的过程中,如果遇到链接行(Chained Row),则oracle为了读取剩下的行将发生额外的IO,这时将执行单块IO。有必要明确了解链接行(Chained Row)和迁移行(Migrated […]