我们知道可以设置表的属性CACHE将表数据放入数据缓存中,也可以设置表将其放入KEEP缓冲池,这两者的区别如下:
BUFFER POOL包括DEFAULT、KEEP、RECYCLE三个POOL,其大小分别对应三个参数: DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,这三个POOL相互独立,没有包含的关系。 语法如下: create/alter table ...... storage(buffer_pool keep); 当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留, 保留的时间长短依据keep pool的负载而定。
create/alter table ...... cache; 当全表扫描时,放入default pool 的LRU热端(如无cache,则放入LRU冷端,很快就会 被age out),适合频繁使用的小表,如果有很多表要cache,那应该把表放如keep pool.
全表扫描时,数据是放入default pool的LRU冷端,所以可能很快就会被从内存中age out, 对一些频繁使用的小表来说效率就比较底了,所以使用cache 子句,在全表扫描时,让oracle 把数据放入LRU的热端,避免很快被age out,如果有太多的表cache,LRU链表会很拥挤,LRU机 制也会受影响,所以该把表放入keep pool,而且cache子句也不适合大表,因为有可能这个大 表会占据整个LRU链表。
对于放入KEEP POOL中的表数据,要么全表放入,要么全表都out,不会只放入一部分数据。
当BUFFER_POOL和CACHE同时使用时,KEEP比NOCACHE有优先权。 BUFFER_POOL用来指定存贮的缓冲池,而CACHE/NOCACHE指定存储的方式。
附注:对于8i,需要设置参数buffer_pool_keep,还要修改 db_block_lru_latches, 该参数默认是1,无法使用buffer_pool_keep。该参数应该比2*3*CPU数量少,但是要 大于 1,才能使用buffer_pool_keep。buffer_pool_keep从db_block_buffers中分配, 因此也要小于db_block_buffers。 |