一、引言:

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

二、关于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显然是不合适的,这些块会导致过量的缓冲区刷新输出,而且不会带来任何好处,因为等你想要再用这个块时,它可已经老化退出了缓存。要把这些段与默认池和保持池中的段分开,这样就不会导致默认池和保持池中的块老化而退出缓存。

2.1、查看keep pool剩余大小:

 SQL> conn /as sysdba
已连接。 select p.name,a.cnum_repl "total buffers",a.anum_repl "free buffers"
from x$kcbwds a, v$buffer_pool p
3 where a.set_id=p.LO_SETID and p.name='KEEP'; NAME total buffers free buffers
-------------------- ------------- ------------
KEEP 12400 12400

2.2、查看当前keep pool的大小:

 select component,current_size from v$sga_dynamic_components
2 where component='KEEP buffer cache'; COMPONENT CURRENT_SIZE
---------------------------------------------------------------- ------------
KEEP buffer cache 104857600

2.3、修改表或索引的结构

要把表cache到内存中,要为表或索引指定buffer pool的类型。具体语句如下:

----修改数据库表的存储属性pool

alter table xxx storage(buffer_pool keep);

又如:

CREATE INDEX cust_idx ... STORAGE (BUFFER_POOL KEEP);

ALTER TABLE customer STORAGE (BUFFER_POOL KEEP);

ALTER INDEX cust_name_idx STORAGE (BUFFER_POOL KEEP);

同时要修改表的cache属性:

Alter table xxx cache;

也可以在表创建时直接指定相应的属性:

create table aaa(i int) storage (buffer_pool keep);

create table bbb(i int) storage (buffer_pool keep) cache;

观察表的cache情况及大小:

select table_name,cache,blocks from user_tables where buffer_pool='KEEP';

2.4、进行全表扫描,将表移入内存:

可以使用ANALYZE table xxx ESTIMATE STATISTICS分析表,使表读入到keep pool中。也可以使用其它的如全表扫描的语句达到相同的目的。如select * from xxx;

要想验证是否已经cache到pool中,可以打开执行计划,看具体的物理读的次数,若已经cache,则物理读为0.

storage到keep pool中的表,第一次会直接physical reads到keep pool中,下次就直接从keep pool中读了。但flush buffer_cache会清空keep pool。

三、具体实例:

实验前提:必须保证db_keep_cache_size值不为0,所以首先有如下操作:

 --     ----此处只是做实验,所以设置为100M。  SQL> alter system set db_keep_cache_size=100M;

 系统已更改。

 SQL> drop table jack purge;
drop table jack purge
*
第 1 行出现错误:
ORA-00942: 表或视图不存在 SQL> create table jack as select * from dba_objects; 表已创建。
SQL> create index indx_object_id on jack(object_id); 索引已创建。 ----未执行Keep命令,通过如下查询出BFFUER_POOL列值为DEFAULT,表示未KEEP。---- SQL> select BUFFER_POOL from user_tables where TABLE_NAME='JACK'; BUFFER_
-------
DEFAULT SQL> select BUFFER_POOL from user_indexes where INDEX_NAME='INDX_OBJECT_ID'; BUFFER_
-------
DEFAULT SQL> alter index indx_object_id storage(buffer_pool keep); 索引已更改。 ----以下将索引全部读进内存---- SQL> select /*+index(jack,indx_object_id)*/ count(*) from jack where object_id is not null; COUNT(*)
----------
72531 SQL> alter table jack storage(buffer_pool keep); 表已更改。 ----以下将数据全部读进内存---- SQL> select /*+full(jack)*/ count(*) from jack; COUNT(*)
----------
72531 ----执行KEEP操作之后,通过如下查询出BUFFER_POOL列值为KEEP,表示已经KEEP成功了。 SQL> select BUFFER_POOL from user_tables where TABLE_NAME='JACK'; BUFFER_
-------
KEEP SQL> select BUFFER_POOL from user_indexes where INDEX_NAME='INDX_OBJECT_ID'; BUFFER_
-------
KEEP

附录:与cache到内存相关的命令

--表缓存

alter table ..... storage(buffer_pool keep);

--查看哪些表被放在缓存区 但并不意味着该表已经被缓存

select table_name from dba_tables where buffer_pool='keep';

--查询到该表是否已经被缓存

select table_name,cache,buffer_pool from user_TABLES where cache like '%Y';

--已经加入到KEEP区的表想要移出缓存,使用

alter table table_name nocache;

--查询当前用户下表的情况

select table_name,cache,buffer_pool from user_TABLES;

--对于普通LOB类型的segment的cache方法

alter table t2 modify lob(c2) (storage (buffer_pool keep) cache);

--取消缓存

alter table test modify lob(address) (storage (buffer_pool keep) nocache);

--查询段

select segment_name,segment_type,buffer_pool from user_segments;

--对基于CLOB类型的对象的cache方法

alter table lob1 modify lob(c1.xmldata) (storage (buffer_pool keep) cache);

--查询该用户下所有表内的大字段情况

select column_name,segment_name from user_lobs;

Oracle将表keep到内存的更多相关文章

  1. oracle中如何将表缓存到内存中

    oracle快速将表缓存到内存中,使得访问速度加快. 共有2种方法:   1)alter table fisher cache; 2)alter table fisher storage(buffer ...

  2. 如何利用Oracle外部表导入文本文件的数据

    同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...

  3. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

  4. Oracle多表连接,提高效率,性能优化 (转)

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. ...

  5. [转]oracle学习入门系列之五内存结构、数据库结构、进程

    原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...

  6. Oracle全表扫描

    优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...

  7. Oracle DB 自动管理共享内存

    • 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...

  8. oracle维护表空间和数据文件

    1:重要参考 wiki 2: oracle doc 表空间参考 3:来自dba-oracle的参考 26,27,28,29 一:oracle 表空间概念 表空间是联系数据库的物理磁盘(数据文件)和逻辑 ...

  9. Oracle 用户 表 表空间之间的关系和管理

    文献地址: https://blog.csdn.net/jmilk/article/details/51599260 https://www.cnblogs.com/roger112/p/768530 ...

随机推荐

  1. Android仿QQ窗口的抖动的动画效果

    就是仿照QQ窗口的抖动效果,在项目的res下创建anim文件夹,再创建两个xml文件:cycle.xml  . myanim.xml   cycle.xml  :   <?xml version ...

  2. yaffs2文件系统镜像分析

    概述 yaffs2文件系统镜像通过mkyaffs2img工具制作,由源码可编译出两个镜像工具mkyaffsimage和mkyaffs2image,其中mkyaffsimage是针对yaffs文件系统, ...

  3. 线性空间光照(即Gamma)

    在渲染管线中正确使用Gamma校正是决定渲染效果的一个非常重要的因素,现在商业引擎包括很多国内引擎都已经是在线性空间计算光照.当然也包括我们之前公司设计的引擎.关于gamma校正的定义可以查看wiki ...

  4. flock防止重复rsync

    我使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题 ...

  5. c#两个数据库之间进行表拷贝

  6. JAVA NIO系列(三) Buffer 解读

    缓冲区分类 NIO中的buffer用于和通道交互,数据是从通道读入缓冲区,从缓冲区中写入通道的.Buffer就像一个数组,可以保存多个类型相同的数据.每种基本数据类型都有对应的Buffer类: 缓冲区 ...

  7. IOS 加载Xib 后 如何 动态修改xib中的控件frame

    看看xib里view是不是设置了自动布局 use auto layout.取消掉就可以了.

  8. PostgreSQL Replication之第十二章 与Postgres-XC一起工作(3)

    12.3 配置一个简单的集群 在本章中,我们要建立一个由三个数据节点组成的集群.一个协调节点,以及管理集群的全局事务管理节点.对于每个组件,我们必须创建一个目录: hs@vm:~/data$ ls - ...

  9. AJAX简单的数据增删改与分页应用

    运行截图: PageBar.js: /* * 说明: * 整体思想,1.第一页时不显示:首页,上一页, * 2.最后一页时不显示:下一页,尾页 * 3.中间有 5 页导航, * 若:3.1.(总页数& ...

  10. springday05-go1

    新建web工程spring-netcross1.导入spring文件夹里的七个jar包,另外还要导入jdbc-lib的四个jar包,ojdbc.jar,commoms-pool,commons-dbc ...