- 浏览: 7971 次
- 性别:
- 来自: 深圳
最新评论
缓存表 内存表(将表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;
一、引言:
有时候一些基础表需要非常的频繁访问,尤其是在一些循环中,对该表中的访问速度将变的非常重要。为了提高系统的处理性能,可以考虑将一些表及索引读取并保存到内存中。
二、关于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;
发表评论
-
Oracle学习的知识点
2015-10-22 10:02 0Oracle学习的知识点 1、SQL、PL/SQL 2、Or ... -
索引讲解
2015-10-22 09:54 01.1 索引概念 索引是对 ... -
修改oracle为归档模式
2015-10-20 20:29 0修改oracle为归档模式 1,查看是否为归档模式 SQL ... -
SQLPLUS下显示CLOB中的内容
2015-10-20 20:29 0SQLPLUS下显示CLOB中的内容 create tabl ... -
捕捉批量写入错误信息-定位到某行
2015-10-20 20:29 0insert into select 批量加载出错解决方案 ... -
使用索引搜索字段为空的记录
2015-10-20 20:28 0使用索引搜索字段为空的记录 昨天下午时发现监控告警,数据库的 ... -
Oracle体系结构详细图解
2015-10-20 20:28 0Oracle体系结构详细图解 ... -
关于shared pool的深入探讨
2015-10-20 20:28 0关于shared pool的深入探讨(一) 关于shared ... -
表与索引的分析及索引重建(compute statistics,rebuild)
2015-10-20 20:27 0表与索引的分析及索引重建(compute statistics ... -
kill session会话不释放的问题
2015-10-20 20:26 0kill session会话不释放的问题 一般情况下,在杀一 ... -
动态性能视图 - v$mystat,v$sesstat,v$statname
2015-10-20 20:26 0动态性能视图 - v$mystat,v$sesstat,v$s ... -
Oracle直接路径加载--append的深度解析
2015-10-20 20:25 0Oracle直接路径加载--append的深度解析 ㈠ 直接 ... -
Oracle insert /*+ APPEND */原理解析
2015-10-20 20:25 0Oracle insert /*+ APPEND */原理解析 ... -
数据库容灾及数据中心(DC)解决方案
2015-10-20 20:25 0第一章 需求分析 1.1 系 ... -
数据库在线备份原理
2015-10-20 20:24 0Oracle数据库在线备份原理 1前言 本文从ORA ... -
DBMS_COMPARISON 数据对比
2015-10-20 20:24 0DBMS_COMPARISON 数据对比 参考: http: ... -
exp :EXP-00091 以及sqlplus乱码
2015-10-20 20:24 0exp :EXP-00091 以及sqlplus乱码 對一個 ... -
全文检索数据库环境配置
2015-10-20 20:23 0Oracle全文检索 1、检查O7_DICTIONARY_A ... -
IOT(Index Organized Table)简述
2015-10-20 20:23 0IOT(Index Organized Table)简述 对 ... -
45个非常有用的 Oracle 查询语句
2015-10-20 20:22 045个非常有用的 Oracle 查 ...
相关推荐
中,那么操作系统将暂时停止您的进程,将其他内存转存到硬盘中,从硬盘上加载被请求的内存,然后再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,可以访问比您物理上安装的内存更多的内存。 ...
其次,它不仅可以将虚拟地址映射到物理的 RAM 或者 swap,它还可以将它们映射到文件和文件位置,这样,读写内存将对文件中的数据进行读写。不过,在这里,我们只关心 mmap 向进程添加被映射的内存的能力。 munmap() ...
调整共享缓冲区缓存 21 库缓冲区 24 调整日志缓冲区 24 调整排序区 25 调整大池缓冲区 26 调整JAVA池缓冲区 26 PRE_PAGE_SGA 27 LOCK_SGA 27 use_indirect_data_buffers 28 pga_aggregate_target: 28 SGA_TARGET 28 ...
说明: 此参数指定链接程序 (如: UNIX 中的 ld, 或用于将目标文件链接到共享对象或 DLL 的 GNU ld) 的完整路径名。此参数是可选的。随每个平台附带的特有的 make 文件中包含此参数的默认值。如果为此参数指定了一个值...
5.2.10 将归档重做日志自动传送到备用 数据库 5.2.11 启动管理恢复 5.2.12 只读打开备用数据库 5.2.13 热备用数据库的维护 5.3 回顾 第6章 高级的失败切换方法 6.1 将 Oracle 并行服务器用于失败切换 6.2 ...
内存管理使用lru算法,更好的管理bitmap内存; 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等... 使用xUtils快速开发框架需要有以下权限: ...
§1.6 块缓存(数据高速缓冲区) 33 §1.7 数据库写入进程 34 §1.8 日志写进程 34 §1.9 数据库检查点 34 §1.10 归档处理 35 §1.11 程序全局区(PGA) 35 第2章 警告日志与跟踪日志 35 §2.1 警告与日志文件 36 §...
本资源为大数据基础到中高级教学资源,适合稍微有点大数据或者java基础的人群学习,资源过大,上传乃是下载链接,不多说,上目录: 1_java基础2 l3 a2 a$ t7 J2 b+ `- p 2_java引入ide-eclipse 3_java基础知识-循环...
3.2. 数据库表认证 3.2.1. 简介 3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 ...