Oracle 查询数据时可分3 种情况读取数据:db block gets、consistent gets、physical reads,它们三者之间的关系大致可概括为:逻辑读(logical reads)指的是Oracle 从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'physical reads'。
产生 Physical reads(物理读)的主要原因如下。
>> 在数据库高速缓存中不存在这些块。
>>全表扫描。
>>磁盘排序。
要想查询速度快,应该尽量避免Physical reads,尽量从缓存读取数据。可通过执行以下SQL
语句来查看Oracle 缓存的命中率:
select 1 - ((physical.value - direct.value - lobs.value) / logical.value)
"Buffer Cache Hit Ratio"
from v$sysstat physical,v$sysstat direct,v$sysstat lobs,v$sysstat logical
where physical.name = 'physical reads'
and direct.name='physical reads direct'
and lobs.name='physical reads direct (lob)'
and logical.name='session logical reads';
该项显示buffer cache 大小是否合适,通常在OLTP 系统中,这个值应该大于90%,否则需要考虑增加buffer cache 的大小。
在考虑调整buffer cache hit ratio 时,需要注意:如果上次增加buffer cache 的大小以后,没有对提高hit ratio 产生很大效果的话,不要盲目增加buffer cache 的大小以提高性能。因为对于排序操作或并行读,Oracle 是绕过buffer cache 进行的。在调整buffer cache 时,尽量避免增加很多的内存而只是提高少量hit ratio 的情况出现。
可通过执行以下语句查看Oracle 的buffer cache size:
show parameter _size