一、引言:

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

二、关于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剩余大小:

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

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

  1. select component,current_size from v$sga_dynamic_components
  2. 2 where component='KEEP buffer cache';
  3.  
  4. COMPONENT CURRENT_SIZE
  5. ---------------------------------------------------------------- ------------
  6. 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,所以首先有如下操作:

  1. -- ----此处只是做实验,所以设置为100M SQL> alter system set db_keep_cache_size=100M;
  2.  
  3. 系统已更改。
  4.  
  5. SQL> drop table jack purge;
  6. drop table jack purge
  7. *
  8. 1 行出现错误:
  9. ORA-00942: 表或视图不存在
  10.  
  11. SQL> create table jack as select * from dba_objects;
  12.  
  13. 表已创建。
  14. SQL> create index indx_object_id on jack(object_id);
  15.  
  16. 索引已创建。
  17.  
  18. ----未执行Keep命令,通过如下查询出BFFUER_POOL列值为DEFAULT,表示未KEEP。---- SQL> select BUFFER_POOL from user_tables where TABLE_NAME='JACK';
  19.  
  20. BUFFER_
  21. -------
  22. DEFAULT
  23.  
  24. SQL> select BUFFER_POOL from user_indexes where INDEX_NAME='INDX_OBJECT_ID';
  25.  
  26. BUFFER_
  27. -------
  28. DEFAULT
  29.  
  30. SQL> alter index indx_object_id storage(buffer_pool keep);
  31.  
  32. 索引已更改。
  33.  
  34. ----以下将索引全部读进内存---- SQL> select /*+index(jack,indx_object_id)*/ count(*) from jack where object_id is not null;
  35.  
  36. COUNT(*)
  37. ----------
  38. 72531
  39.  
  40. SQL> alter table jack storage(buffer_pool keep);
  41.  
  42. 表已更改。
  43.  
  44. ----以下将数据全部读进内存---- SQL> select /*+full(jack)*/ count(*) from jack;
  45.  
  46. COUNT(*)
  47. ----------
  48. 72531
  49.  
  50. ----执行KEEP操作之后,通过如下查询出BUFFER_POOL列值为KEEP,表示已经KEEP成功了。 SQL> select BUFFER_POOL from user_tables where TABLE_NAME='JACK';
  51.  
  52. BUFFER_
  53. -------
  54. KEEP
  55.  
  56. SQL> select BUFFER_POOL from user_indexes where INDEX_NAME='INDX_OBJECT_ID';
  57.  
  58. BUFFER_
  59. -------
  60. 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. centos 下 django 1.8 配置好后 admin 后台无法显示 样式解决办法

    解决前 解决命令 [root@ayibang-server static]# cat /etc/nginx/conf.d/office_djaong_uvpv.conf server { listen ...

  2. 初涉MySQL

    本文要点: MySQL基础 安装MySQL 配置MySQL 使用MYSQL 一.MySQL基础 MySQL 由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据 ...

  3. [Shapefile C Library]读取shp图形(.net Wapper)

    ShapeLib的.net Wapper版可以在官网下载到,在WorldWind中也有使用.ORG据说也是使用的ShapeLib实现的shp文件的读写. 官网:http://shapelib.mapt ...

  4. InitializingBean afterPropertiesSet

    package org.test.InitializingBean; import org.springframework.context.support.ClassPathXmlApplicatio ...

  5. IIS URL Rewrite redirect from one Domain to another

    IIS URL Rewrite enables Web administrators to create powerful rules to implement URLs that are easie ...

  6. 一个小玩意 PHP实现微信红包金额拆分试玩

    <meta charset="utf-8"> <?php // 新年红包金额拆分试玩 class CBonus { public $bonus;//红包 publ ...

  7. Java基础之创建窗口——使用流布局管理器(TryFlowLayout)

    控制台程序. FlowLayout把组件放在容器的连续行中,使每一行都放置尽可能多的组件.如果某行已满,就放在下一行.工作方式类似于文本处理器把单词放在行中.主要用途是放置按钮,但也可以用来放置其他组 ...

  8. IntelliJ IDEA 下的版本控制介绍

    不管是个人开发或是团队开发,版本控制都是可以很好地被使用的,目前我找不到任何开发者不使用版本控制的理由.而且对于 IDE 来讲,集成版本控制的本身就是它最大的亮点之一,很多开发者也是为此而使用它. 在 ...

  9. 省市联动初探AJAX操作数据

    主要学习代码: List.html <script type="text/javascript"> function GetXhr() { return new XML ...

  10. [转]JVM内幕:Java虚拟机详解

    本文由 ImportNew - 挖坑的张师傅 翻译自 jamesdbloom.欢迎加入翻译小组.转载请见文末要求. 这篇文章解释了Java 虚拟机(JVM)的内部架构.下图显示了遵守Java SE 7 ...