当研究oracle的查找方式中发现,在全表扫描和索引扫描时,会用到db_file_multiblock_read_count来一次读取多个IO。也看了一些关于db_file_multiblock_read_count的文章,为加深自己的理解,特做个试验研究。
以下是reference对它的解释:
参数类型: Integer
默认值: 这个值对应最大的I/O大小,但是它是平台依赖的。
修改方法:ALTER SESSION, ALTER SYSTEM
值范围:依赖于操作系统
这个参数的意思是,在Table scan中,一次连续读(sequential read)能获取的最大块数。当然这个值,不能超过操作系统和硬件的I/O极限。如果超过了,Oracle则会使用实际最大值。一般在OLTP系统中,这个值是4~16
执行语句:
列AMOR_VAL没有建立任何索引,同时COST_LEDG_H有大约3百万行数据。
执行:
统计结果:
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 5352 (4)| 00:01:05
13784 consistent gets
统计结果:
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 3914 (5)| 00:00:47
13784 consistent gets
执行
统计结果:
| 0 | SELECT STATEMENT | | 1 | 2 | 3194 (6)| 00:00:39
13784 consistent gets
通过以上的例子发现,我们将 db_file_multiblock_read_count 改成4,8,16后,虽然查询的IO次数没变,但查询的时间从65s,47s,39s的减少,
效果显著,同时Cost也限制减少。
总结:较大的db_file_multiblock_read_count 可以获得较好的性能提升。