体系结构中共享池研究

1.keep 让SQL跑得更快。

 有时候一些基础表需要非常的频繁访问,尤其是在一些循环中,对该表中的访问速度将变的非常重要。为了提高系统的处理性能,可以考虑将一些表及索引读取并保存到内存中。

二、关于keep内存的几个参数

    下面了解一下具体和CACHE有关的几个概念,即DB_CACHE中的几个pool:

      DB_CACHE_SIZE:指定缺省的buffer pool的大小,以字节为单位。

      DB_KEEP_CACHE_SIZE:指定keep buffer pool的大小,以字节为单位。

      DB_RECYCLE_CACHE_SIZE:指定recycle buffer pool的大小,以字节为单位。

    Keep Buffer Pool

      其作用是缓存那些需要经常查询的对象但又容易被默认缓冲区置换出去的对象,按惯例,Keep pool设置为合理的大小,以使其中存储的对象不再age out,也就是查询这个对象的操作不会引起磁盘IO操作,可以极大地提高查询性能。

      默认的情况下db_keep_cache_size=0,未启用,如果想要启用,需要手工设置db_keep_cache_size的值,设置了这个值之后db_cache_size会减少。

      并不是我们设置了keep pool之后,热点表就一定能够缓存在keep pool,keep pool同样也是由LRU链表管理的,当keep pool不够的时候,最先缓存到keep pool的对象会被挤出,不过与default pool中的LRU的管理方式不同,在keep pool中表永远是从MRU移动到LRU,不会由于你做了FTS而将表缓存到LRU端,在keep pool中对象永远是先进先出。

    Recycle Buffer Pool

      Recycle Buffer Pool正好相反。Recycle Buffer Pool用于存储临时使用的、不被经常使用的较大的对象,这些对象放置在Default Buffer Pool显然是不合适的,这些块会导致过量的缓冲区刷新输出,而且不会带来任何好处,因为等你想要再用这个块时,它可已经老化退出了缓存。要把这些段与默认池和保持池中的段分开,这样就不会导致默认池和保持池中的块老化而退出缓存。

--前提:必须保证db_keep_cache_size值不为0,所以首先有如下操作:
--此处只是做试验,所以暂缺设置100M这么大。
alter system set db_keep_cache_size=100M;
drop table t;
create table t as select * from dba_objects;
create index idx_object_id on t(object_id);

--未执行KEEP命令,通过如下查询出BUFFER_POOL列值为DEFAULT,表示未KEEP。

select BUFFER_POOL from user_tables where  TABLE_NAME='T';
select BUFFER_POOL from user_indexes where INDEX_NAME='IDX_OBJECT_ID';
 


alter index idx_object_id storage(buffer_pool keep); 
--以下将索引全部读进内存
select /*+index(t,idx_object_id)*/ count(*) from t where object_id is not null; 
--以下将数据全部读进内存
alter table t storage(buffer_pool keep); 
select /*+full(t)*/ count(*) from  t;



--执行KEEP操作后,通过如下查询出BUFFER_POOL列值为KEEP,表示已经KEEP成功了

select BUFFER_POOL from user_tables where  TABLE_NAME='T';
select BUFFER_POOL from user_indexes where INDEX_NAME='IDX_OBJECT_ID';


--疑问,请问是否只有执行下面命令才是真正缓存到keep内存呢? 

--查询到放在keep区中的表,但是不意味着表已经被缓存. 

--将表T缓存

SQL> alter table t cache; 
原文地址:https://www.cnblogs.com/yg_zhang/p/3840477.html