将小表CACHE到数据缓存
• 在多个缓存池的配置下,每个缓存池都是由独立的LRU算法来管理的,通常情况下刚存取的块都是放在LRU列表的开始端,而FTS(全表扫描)例外,刚读入的块放在LRU列表的末端;
• 上述算法会产生如下一些困境:CBO在读取一些小表或者读取表中的较多数据时会使用FTS,这时,即使这些表使用频率很高,也会因为上面提到的原因而很快被老化,在下次用到时又得重新读入;
• 为了解决这个难题,引进了Cache表的概念,将表设为Cache后,对表的FTS不再是将块放在LRU列表的末端,而是置于LRU列表的开始端;
• 有下面三种方法将表设为Cache:
ü 创建时指定CACHE关键字:Create table … cache;
ü 更改时指定CACHE关键字:Alter table … cache;
ü 查询时指定CACHE hint:select /*+ cache */ * from …;
• 从DBA_TABLES.CACHE字段可以查到由前两种方法设置的表的CACHE属性。
绕过缓存池
• 下面两种特定的操作可以绕过缓存池,读入的数据块不进入数据缓存,而存放在内存中由用户服务器进程控制的其它区域(UGA,PGA?):
ü Sort Direct Writes(第八章调整IO时会讲到);
ü Parallel DML(由多个服务器进程来执行一个DML操作,只有当系统中有多个CPU,多个IO子系统以及足够内存时才可考虑作这样的设置,并行DML超出本书讨论的范围)。
正确地使用索引
• 不正确的全表扫描会极大地降低数据缓存的命中率,创建正确的索引后可以提高数据缓存性能;
• 建议尽可能地在外键上创建索引,这可以提高多表连接的效率。