Oracle在执行全表扫描(full table scan)或全索引扫描(index full scan)时,为保障性能,尽量一次性读取多个块,这称为Multi Block I/O.
每次执行Multi Block I/O,都会等待物理I/O结束,此时等待db file scattered read 事件。
利用db file scattered read 等待事件的P1=file#
SQL> show parameter multi
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count integer 128
SQL> alter system set db_file_multiblock_read_count=10000;
System altered.
SQL> show parameter multi
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count integer 4096
SQL> alter system set db_file_multiblock_read_count=999999999;
System altered.
SQL> show parameter multi
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count integer 4096
这个值每个OS都有最大值的限制,可以看到此环境最大值只能设置为4096
db_file_multiblock_read_count 针对的是物理读
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读取。如果剩下的块有2个,就会执行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.
对于行链接和行迁移的不同点需要准确理解。
行链接是在行的大小比块大小大的时候发生,因此使用更大的块或减少PCTFREE值之外,再没有可消除行链接的方法。
行迁移起初记录到一个块里,但随着行的大小不断增大,块内没有空间时发生迁移。这时实际上行移动到另外的块,在原来的行里插入了指明转移后块和行位置的ROWID。
行迁移特别是在通过索引扫描表时会给性能带来严重影响,这是因为读取一个行时需要读取2个或2个以上的块。行迁移对FTS带来的影响需要稍微留意。
FTS是对HWM以下的所有块从头开始顺序读取的工作,在执行FTS过程中,Oracle如果遇到行迁移,则不会引发更多的Single Block I/O,而是继续工作。
这是因为知道反正要扫描过程中需要重新读取. 因此如果HWM的位置相同,则不管行迁移存在与否,FTS自身性能几乎不变。
当然如果发生了迁移,就会追加分配区。如果HWM移动得更远,就会给FTS的性能造成影响,消除行迁移时压迫留心以上部分。