在以前的版本当中, oracle数据库不能将用户查询的大表数据缓存到buffer cache当中, 因为缓存大表的时候会将数据库中有用的数据从内存中给置换出来, 这样的就不能提高数据库的效率了。
但是从12.1.0.2版本开始,如果数据库的实例的内存足够大,大到可以讲数据库所有的数据都能够缓存所有的数据库的数据的情况时,数据库开启全库缓存,这样数据库将所有的数据缓存到buffer cache当中。 将所有的数据都缓存到内存当中的时候,可以提高数据库的性能。
可以通过下面的步骤将数据库开启全库缓存模式。
ALTER DATABASE FORCE FULL DATABASE CACHING;
该命令必须在数据库启动到mount状态时,执行。
同时在关闭数据库,启动到mount状态时,最好先触发checkpoint然后正常的关闭数据库。
在开启上述的模式的情况下, 数据库认为内存已经可以满足将数据库上的所有的数据都缓存到buffer cache上了。
可以通过下面的命令查询数据库是否开启了强制全库缓存模式
Select force_full_db_caching from v$database;
开启全库缓存模式下关于大字段缓存问题
在默认的数据库缓存模式下,Nocache lobs这样的大字段类型是不能被缓存到buffer cache当中的。 但是开启全库缓存模式的情况下, nocache lobs这样的大字段也是可以缓存到buffer cache当中。 同理 其他类型的lob字段不管是普通的还是 securefiles lob还是basicfiles
lob都是可以缓存到buffer cache当中的。
我们知道普通情况下,buffer cache当中的数据是只要读才能缓存到数据库的buffer cache当中, 其实全库缓存模式下仍然是相同的。 只有访问的数据才可以缓存到buffer cache。
在多租户的环境当中force full database会适用于cdb和所有的pdb当中。
关于全库强制缓存的信息存储在控制文件当中, 如果控制文件损坏然后重建的话, 那么可能会造成全库强制缓存模式丢失。
开启全库强制缓存的前提条件
1 数据库版本12.2
2 buffer cache 的大小足够将数据库中的数据整体缓存
当使用sga_target或者是使用memory_target的时候buffer cache使用的是自动内存管理,
其大小根据负载进行自动的调整 。 通过下面的语句可以查询估算的buffer cache的大小。
SELECT NAME, BYTES
FROM V$SGAINFO WHERE NAME='Buffer Cache Size';
如果你想要估算数据库的buffer cache的需求的时候,可以使用下面的方式进行估算
Buffer cache =60%*
sga_target
Sga_target=60% *
memory_target
启动和关闭数据库的强制数据库缓存
1 登录拥有alter database用户
2 启动数据库到mount状态
3 ALTER DATABASE FORCE FULL DATABASE CACHING;
4 alter database open;
关闭
2 启动数据库到mount状态
ALTER DATABASE NO FORCE FULL DATABASE CACHING;
4 alter database open;