根据索引访问表时,访问的每一行,都可能来自不同的表块,我们无法一次读取多个块,而在全表扫描时,因为是依次读取表的所有块,ORACLE完全可以一次读多个块,这就是多块读,就是一次读多个快。而访问索引和根据索引访问表,都是单块读,也就是一次只读一个块,多快读比单块读速度要快。

多快读时一次读的数量:

show parameter db_file_mu
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count        integer     91

另外,由于多快读的连续性,它还要受区的制约。因为只有区内的块,在磁盘上才是连续的。而一个段所属区与区之间,可能并不相连。因此,如果区的大小事10个块,多块读一次只能读10个块,除了区的制约外,多块读还要受操作系统IO大小的限制。如果操作系统最多只能读1MB的数据,假设数据库块的大小是8kb,那么多块多一次最多只能读128个块。

db file scattered read是全表扫描时的等待事件,db file sequential read是索引扫描的等待事件。这两个事件的P1参数代表正在读取的文件号,P2参数是正读取的块号,P3参数是一次读取的块数量。对于单块读的等待事件db file sequential read,P3参数将一直都是1.

SELECT A.KSPPINM PARAMETER, A.KSPPDESC DESCRIPTION, B.KSPPSTVL SESSION_VALUE,
C.KSPPSTVL INSTANCE_VALUE
FROM X$KSPPI A, X$KSPPCV B, X$KSPPSV C
WHERE A.INDX = B.INDX AND A.INDX = C.INDX AND
--SUBSTR(A.KSPPINM, 1, 1) = '_' and 
a.KSPPINM ='_small_table_threshold'
ORDER BY A.KSPPINM ;