oracle 缓存表

oracle的db_buffer_pool由三部分组成:

buffer_pool_defualt

buffer_pool_keep

buffer_pool_recycle

如果要把表钉死在内存中,也就是把表钉在keep区。

相关的命令为:

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

这句命令把表示表如果缓存的话是缓存在keep区。

可以通过语句:

select table_name from dba_tables where buffer_pool='KEEP';查询到改表是放在keep区中的。

但是不意味着表已经被缓存了。

下面的语句把表缓存:

alter table .... cache;

可以通过

select table_name from dba_ tables where rtrim(cache)='Y'

查询到该表已经被缓存了。

加入到keep区的表不是说不能被移出内存,不过是比较不容易移出内存。

也可以手工来移出内存,命令如下:

alter table ... nocache;


oracle实例的default,keep,recycle池的理解--**************************************************************************
--***
--***关于DB中各种数据缓冲池大小
--***
--**************************************************************************
SQL> SHOW PARAMETER CACHE

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 25165824
db_keep_cache_size big integer 0
db_recycle_cache_size big integer 0

--**************************************************************************
--***
--***查询数据字典V$BUFFER_POOL,本处只有DEFAULT池,为24M
--***
--**************************************************************************
Select * From V$BUFFER_POOL;
ID 3
NAME DEFAULT
BLOCK_SIZE 8192
RESIZE_STATE STATIC
CURRENT_SIZE 24
BUFFERS 3000
TARGET_SIZE 24
TARGET_BUFFERS 3000
PREV_SIZE 0
PREV_BUFFERS 0
LO_BNUM 0
HI_BNUM 0
LO_SETID 3
HI_SETID 3
SET_COUNT 1
--**************************************************************************
--***
--***更改KEEP池,为10M,并重新启动数据库
--***
--**************************************************************************
SQL> ALTER SYSTEM SET db_keep_cache_size=10m SCOPE=SPFILE;

系统已更改。

SQL> SHUTDOWN IMMEDIATE;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP ;
ORACLE 例程已经启动。

Total System Global Area 147921840 bytes
Fixed Size 453552 bytes
Variable Size 109051904 bytes
Database Buffers 37748736 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
--**************************************************************************
--***
--***重新启动数据库后,发现DB_CACHE_SIZE=24M,KEEP池为12M,同时查询数据字典BUFFER
--***发现DEFAUL=24M,KEEP=12M.可以得出结论,KEEP是通过db_keep_cache_size参数设置,根
--***DB_CACHE_SIZE无关。实际上DB_CACHE_SIZE是设置DEFAULT的
--***
--**************************************************************************
SQL> SHOW PARAMETER CACHE;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------

db_cache_size big integer 25165824
db_keep_cache_size big integer 12582912

Select * From V$BUFFER_POOL;
ID NAME BLOCK_SIZE RESIZE_STATE CURRENT_SIZE
1 KEEP 8192 STATIC 12
3 DEFAULT 8192 STATIC 24
DB BUFFERS表示总的缓冲区大小
它分为三部分(不包括不同块大小的缓冲区),一部分是DEFAULT,一部分是KEEP池,一部分是RECYCLE池。
在你设置KEEP,RECYCLE池:你全表扫描的时候,数据被放入到DEFAULT的LRU列表的LRU端。如果你使用了ALTER TABLE CACHE,则表被放入到LRU列表的MRU端
如果你设置了KEEP,RECYCLE池:并且使用了alter table *** storage(buffer_pool keep);表被放入到指定的池中。 





Oracle Keep池

--Keep池
--创建时把人员表标记为 keep
create table staff(login varchar2(10),name varchar2(20))
storage (buffer_pool keep);
--修改表改存到recycle 回收池
alter table staff storage ( buffer_pool recycle );

--修改表改存到keep 回收池
alter table staff storage ( buffer_pool keep );

---查看Keep 池中的磁盘和内存读取情况
select 
physical_reads Disk_Reads,
db_block_gets + consistent_gets MemoryReads
from v$buffer_pool_statistics
where name ='KEEP'
 



设置缓存表
缓存由两个参数控制SGA_TARGET和PGA_AGGREGATE_TARGET,设置了这两个参数,其他的基本内存部分都由Oracle自动配置为最优值,这也是Oracle推荐的方式。

SGA_TARGET和PGA_AGGREGATE_TARGET是动态参数,可以在不重启数据库的情况下修改。但是SGA_TARGET受限于sga_max_size,SGA_TARGET不能超过sga_max_size,所以要增大sga_target先要增大sga_max_size,而sga_max_size是静态参数,修改sga_max_size必须重启Oracle。

所以修改sga_target和pga_aggregate_target的过程如下:

1、修改sga_max_size

SQL>ALTER SYSTEM SET sga_max_size=4g scope=spfile;

2、重启Oracle

3、设置参数sga_target和pga_aggregate_target,

  alter system set sga_target=4G;
  alter system set pga_aggregate_target=1g; 

如果是oracle10g
已经是ASSM, oracle会根据统计的信息,自动的来调整你的内存组件的大小,你只需要设置sga_target即可。当然你可以手动设置db_cache_size,如果设置了的话,Oracle会在自动调整内存大小的时候把这个作为db_cache_size的最小值。

对于sga_target,在动态修改的时候,最大值不能操过sga_max_size, 如果是 用scope=spfile这个方式来修改可以超过sga_max_size,应该此时sga_max_size也跟着变大了,如果超过的话。

2.
Oracle对数据库的cache有他自己的计算的,10g以后,内存是动态的根据对你使用系统的统计来进行调整的,如果出现问题,这块不是原因,你之所以db cache还没有上去,可能是访问的数据比较少,不过按3楼的,你加大db_cache_size的值,会保留这个内存空间的,但是也是一样的,数据load到内存里,才看得到变化。

你可能感兴趣的:(oracle,sql,cache)