缓存表 内存表(将表keep到内存)

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

二、关于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 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 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、进行全表扫描,将表移入KEEP_CACHE内存:

可以使用ANALYZE table xxx ESTIMATE STATISTICS分析表,使表读入到keep pool中。也可以使用其它的如全表扫描的语句达到相同的目的,需要执行两次。如select * from xxx; 
    要想验证是否已经cache到pool中,可以打开执行计划,看具体的物理读的次数,若已经cache,则物理读为0. 
    storage到keep pool中的表,第一次会直接physical reads到keep pool中,下次就直接从keep pool中读了。但是alter system flush buffer_cache命令会清空keep pool。

2.5、将表/索引移出KEEP_CACHE内存 
    ALTER TABLE customer STORAGE (BUFFER_POOL DEFAULT); 
    ALTER INDEX cust_name_idx STORAGE (BUFFER_POOL DEFAULT);

三、具体实例:

实验前提:必须保证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 storage(buffer_pool default);

--查询当前用户下表的情况 
select table_name,cache,buffer_pool from user_tables;

--缓存普通LOB类型的segment的cache方法 
alter table t2 modify lob(c2) (storage (buffer_pool keep) cache);

--取消缓存普通LOB类型的segment的cache方法 
alter table test modify lob(c2) (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;

https://mandy-rxr.iteye.com/blog/2250337

缓存表 内存表(将表keep到内存)的更多相关文章

  1. (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...

  2. 网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  3. 让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换的策略配置

    前言 上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置. 类库源码:github:https:// ...

  4. 详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dengqi.blog.51cto.com/5685776/1223132 一:M ...

  5. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  6. 分享自研实现的多数据源(支持同DB不同表、跨DB表、内存数据、外部系统数据等)分页查询工具类实现原理及使用

    思考: 提起分页查询,想必任何一个开发人员(不论是新手还是老手)都能快速编码实现,实现原理再简单不过,无非就是写一条SELECT查询的SQL语句,ORDER BY分页排序的字段, 再结合limit ( ...

  7. 【转】mysql分库分表,数据库分库分表思路

    原文:https://www.cnblogs.com/butterfly100/p/9034281.html 同类参考:[转]数据库的分库分表基本思想 数据库分库分表思路   一. 数据切分 关系型数 ...

  8. 【Paddy】如何将物理表分割成动态数据表与静态数据表

    前言 一般来说,物理表的增.删.改.查都受到数据量的制约,进而影响了性能. 很多情况下,你所负责的业务关键表中,每日变动的数据库与不变动的数据量比较,相差非常大. 这里我们将变动的数据称为动态数据,不 ...

  9. YTU 2989: 顺序表基本运算(线性表)

    2989: 顺序表基本运算(线性表) 时间限制: 1 Sec  内存限制: 128 MB 提交: 1  解决: 1 题目描述 编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为char), ...

  10. hibernate建表多对多建表

    Student.java package cn.itcast.hiberate.sh.domain; import java.util.Set; public class Student { priv ...

随机推荐

  1. js控制随机数生成概率代码实例

    基本思路:把Math.random()js随机数生成的数看着百分比,然后定义每个整数值取值范围. 具体内容如下,供大家参考 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  2. angularJS解决数据显示闪一下的问题?-解决办法

    转自:https://www.cnblogs.com/e0yu/p/7219930.html?utm_source=itdadao&utm_medium=referral#undefined ...

  3. 【代码笔记】Web-JavaScript-JavaScript 运算符

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. OpenVDB for Mitsuba

    https://github.com/zhoub/mitsuba-vdb

  5. Java根据年龄段获取对应年份起始时间戳和最终时间戳、根据生日时间戳获取月份(与数据库的时间戳处理成的月份拼接成SQL条件)

    1.传入年龄段,两个值,一个最小值,一个最大值,然后获取该年龄段的两个时间戳: (1)处理时间方法: /** * 根据年龄获取时间戳(开始年龄key取0,返回一年最后一秒时间戳,时间戳大:反之结束年龄 ...

  6. wap2app(九)-- 使用mui.previewImage之后,页面a链接不能跳转

    使用Hbuilder的长按保存图片的预览图片之后,页面所有的a链接都不能跳转. 解决办法: 可以使用下面绑定tap利用js跳转,亲测有效. mui('body').on( 'tap' , 'a' , ...

  7. hdu-2018题(母牛问题)

    HDU-2018题/*有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,每个测试实 ...

  8. (后端)Spring手动回滚事务

    百度上查资料获得的 throw new RuntimeException(); 或者  TransactionAspectSupport.currentTransactionStatus().setR ...

  9. JS的判断字符/元素是否存在数组列表

    python有in操作, 可以很方便的用于判断元素是否存在指定列表. JS的in操作是对象, 用于判断指定的属性在指定对象中是否存在. propNameOrNumber in objectName i ...

  10. shell编程—简介(一)

    1.shell概念 shell是一个用C语音编写的程序,他是用户使用Linux的桥梁 shell既是一种命令语音,又是一种程序设计语音 shell是指一种应用程序,这个应用程序提供一个界面,用户通过这 ...