共计 1353 个字符,预计需要花费 4 分钟才能阅读完成。
Oracle 有三种类型的缓存池,分别是 default,keep 和 recycle。默认情况下只会使用 default 缓存池,另外两种需要额外配置。
keep 缓存池相当于是一直很热的 default 缓存池,缓存池里的数据会一直保留,直到被其他使用该池的数据抢占,并且是使用先进先出的队列使用。
recycle 缓存池相当于是一直很冷的 default 缓存池,里面的数据会很快被清理。
一般情况下只需使用 default 缓存池即可满足需要,有时为了进一步提高效率,在了解表的使用模式的情况下,可以使用 keep 池来减少数据库物理读的数量,显著提高效率,这一切都建立在对数据使用模式很熟悉的情况。
使用 keep 缓存池
首先查看内存分配情况
show parameter memory_target;
show parameter sga_target;
show parameter db%cache_size;
这是在 11g 的版本上的情况,如果使用了自动内存管理,sga_target,db_cache_size,db_keep_cache_size 可能都是没有设置值的。
直接设置 db_keep_cache_size,如果不能成功可能需要设置一个 sga_target 下限值,然后再设置 db_keep_cache_size。
要使用 keep 缓存池还需要设置表的 buffer_pool 存储属性 (创建表时或者直接修改存储属性)
alter table xxx storage(buffer_pool keep);
alter table xxx modify partition part0 storage(buffer_pool keep);
设置完毕按理来说就可以开始使用 keep 缓存池了,一般的小量数据查询现在已经可以使用 keep 池了,但是全表扫描还不会使用 keep 缓存池,这是为什么呢,因为 11g 开始对全表扫描会使用一种 direct path read 技术,直接将数据从磁盘读到 pga,绕过缓存,也就当然不会将数据放在 keep 缓存池了。
由两个隐藏参数控制 direct path read 技术是否使用,_small_table_threshold 和_serial_direct_read。默认是开启 direct path read 的,当表小于_small_table_threshold 时,所读数据会放在数据库缓存里。
直接设置这两个值都不是很理想的方案。
如果想要将一个设置了 keep 的表的块全部装入 keep 缓存池里,可以使用一个技巧,使用索引进行全表扫描,强迫数据库将数据放到 keep 缓存池里。
select /+ index(test_keep idx_keep) / count(*) from test_keep;
keep 缓存池使用还有一个问题,如果是分区表某些分区是 keep,某些是 default,如果使用全表扫描的查询如果包含了 keep 的数据,也有 default 数据,则还是由于 direct path read 技术,已经在 keep 缓存里的数据会被无视。
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/135222.htm