一、引言:

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

二、关于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. python 内存监控模块之memory_profiler

    0. memory_profiler是干嘛的 This is a python module for monitoring memory consumption of a process as wel ...

  2. java web工程读取及修改配置文件

    这篇博客比自己讲解的详细: http://blog.sina.com.cn/s/blog_69398ed9010191jg.html 使用方法: 1)配置文件在web-info的class目录下,或者 ...

  3. 转:DLL如何导出C++的类

    由于DLL的出现是针对C语言的,本身对C++的支持不够好.所以如何从DLL中导出C++的类作为DLL的API的一部分就成了问题. 我试了一下 class __declspec(dllexport) F ...

  4. autorelease基本概念

    // //  main.m //  01-autorelease基本概念 // //  Created by apple on 14-3-18. //  Copyright (c) 2014年 app ...

  5. Ubuntu 的基本操作

    1.Linux 常用shell 命令,和之前用过的红帽差不多.开发所有和程序相关的代码.压缩包都在一个名为topeet的用户文件夹里 学习了Linux 的重要命令apt-get,用它来安装软件:在使用 ...

  6. Oracle RAC inventory.xml损坏后如何修复

    不建议直接修改该文件 1.从其它节点拷贝一份 2.使用runInstaller工具(这个工具位于<GI_HOME>/oui/bin路径下)重建inventory.xml文件 步骤1:添加G ...

  7. 修改RMAN list命令输出的时间格式

    根据需要,修改rman list命令输出结果的时间显示 $ rman target / Recovery Manager: Release - Production on Wed Jul :: Cop ...

  8. PAT 解题报告 1048. Find Coins (25)

    1048. Find Coins (25) Eva loves to collect coins from all over the universe, including some other pl ...

  9. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

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

    12.5 创建表和发送查询 介绍了Postgres-XC以及其底层的思想之后,是时候创建我们的第一个表,看看集群将如何表现.下面的例子演示了一个简单的表.将使用id列的哈希键来分布它: test=# ...