如果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的数据,供所有用户使用。修改数据时,首先从数据文件中取出数据,存储在数据缓冲区中,修改/插入数据也存储在缓冲区中,commit或DBWR(下面有详细介绍)进程的其他条件引发时,数据被写入数据文件。数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。
通过下面的命令查看数据缓冲区内存的大小:
show parameter db_cache_size;
结果见下图:
通过下面的命令可以修改数据缓冲区内存的大小:
alter system set db_cache_size=50M scope=both;
db_cache_size是一个动态参数,可以在运行时修改,因此这里的scope设置为both,新的内存大小马上生效,并且还将修改保存在Oracle的启动文件里。
数据缓冲区也有一个命中率的概念,一般要求命中率在90%或95%以上,如果你的命中率过低,说明你的数据库效率很低,需要调整数据缓冲区的大小。
可以通过下面的命令查看命中率:
select (1 - ((physical.value - direct.value - lobs.value) / logical.value)) * 100 "命中率"
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';
结果如下: