--************************************
-- Oracle 表缓存(caching table)的使用
--************************************
1.使用caching table 的原因
在通常的情况下,应用程序访问在cache中的数据块将按照LRU算法来进行处理。然而对于小表的访问,当使用全表扫描时,则该表
中的块会放置LRU列表最近最少使用尾部的(LRU端),因此很快就被淘汰出局。然而使用基于成本优化的方法,对于小表进行查询以及收
集统计信息,大多情形下走的是全表扫描,因此势必造成一种情形,即该表后续需要再次访问,而每次使用了全表扫描,而该对象很快
被淘汰出局,因此需要再次读入到buffer cache,耗用了大量的I/O。
2.解决该问题的方法
设计表为caching table ,即使对该表使用全表访问时,则该表对象的块仍然被放置在LRU列表最近最多使用的尾部(MRU段)
不要过度的使用caching table,以免造成性能下降
通常将caching table 存放在keep buffer pool,缺省的情况下会放置在default buffer pool。
3.具有cache属性与pin 的差异
对于具有cache属性的对象,并不是将该对象pin到cache里,而是尽可能的延迟该对象驻留cache的时间
而对于pin对象,则是将该对象常驻到内存
4.设计cache table 的方法
创建表对象时,使用cache子句
修改表对象时,使用cache子句
使用cache 提示
创建表对象时使用cache,如下面的例子
create table tb_test
(id number
,name varchar2(20)
,sex char(1)
,age number
,score number)
tablespace users
storage(initial 50k next 50k pctincrease 0)
cache; --指定cache子句
使用alter table 修改已经存在的表
alter table scott.emp cache;
可以使用nocache来修改对象,使其不具备cache属性
alter table soctt.emp nocache
使用hint提示符来实现cache
select /*+ cache*/ empno,ename from scott.emp;