oracle把表数据放入内存


Oracle's buffer cache
  The buffer cache is part of the SGA. It holds copies of data blocks so as they can be accessed quicker by oracle than by reading them off disk.
Purpose
The purpose of the buffer cache is to minimize physical io. When a block is read by Oracle, it places this block into the buffer cache, because there is a chance that this block is needed again. Reading a block from the buffer cache is less costly (in terms of time) than reading it from the disk.  
Keep pool
The keep pool's purpose is to take small objects that should always be cached, for example Look Up Tables.Recycle pool
The recycle pool is for larger objects.
Default pool
The default pool is for everything else.


我们知道可以设置表的属性CACHE将表数据放入数据缓存中,也可以设置表将其放入KEEP缓冲池,这两者的区别如下:
BUFFER POOL包括DEFAULT、KEEP、RECYCLE三个POOL,其大小分别对应三个参数:
DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,这三个POOL相互独立,没有包含的关系。
语法如下:
create/alter table ...... storage(buffer_pool keep);
当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留,
保留的时间长短依据keep pool的负载而定。

create/alter table ...... cache;
当全表扫描时,放入default pool 的LRU热端(如无cache,则放入LRU冷端,很快就会
被age out),适合频繁使用的小表,如果有很多表要cache,那应该把表放如keep pool.

全表扫描时,数据是放入default pool的LRU冷端,所以可能很快就会被从内存中age out,
对一些频繁使用的小表来说效率就比较底了,所以使用cache 子句,在全表扫描时,让oracle
把数据放入LRU的热端,避免很快被age out,如果有太多的表cache,LRU链表会很拥挤,LRU机
制也会受影响,所以该把表放入keep pool,而且cache子句也不适合大表,因为有可能这个大
表会占据整个LRU链表。

对于放入KEEP POOL中的表数据,要么全表放入,要么全表都out,不会只放入一部分数据。

当BUFFER_POOL和CACHE同时使用时,KEEP比NOCACHE有优先权。
BUFFER_POOL用来指定存贮的缓冲池,而CACHE/NOCACHE指定存储的方式。

create/alter table ...... storage(buffer_pool keep); 指定了table被读如时放的缓冲池位置
create/alter table ...... cache;指定要把table pin在buffer 里


SQL> select table_name,CACHE,BUFFER_POOL from user_tables where table_name='ACCTTXNLOG';

TABLE_NAME                     CACHE      BUFFER_
------------------------------ ---------- -------
ACCTTXNLOG                         N      DEFAULT

SQL> alter table ACCTTXNLOG storage(buffer_pool keep);

Table altered.

SQL> select table_name,CACHE,BUFFER_POOL from user_tables where table_name='ACCTTXNLOG';

TABLE_NAME                     CACHE      BUFFER_
------------------------------ ---------- -------
ACCTTXNLOG                         N      KEEP
SQL> alter table ACCTTXNLOG cache;

Table altered.

SQL> select table_name,CACHE,BUFFER_POOL from user_tables where table_name='ACCTTXNLOG';

TABLE_NAME                     CACHE      BUFFER_
------------------------------ ---------- -------

ACCTTXNLOG                         Y      KEEP


SQL> set autotrace on
SQL> select count(*) from ACCTTXNLOG;

  COUNT(*)
----------
         2


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'ACCTTXNLOG'




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         15  consistent gets
          0  physical reads
          0  redo size
        379  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed



alter table XXX storage(buffer_pool keep);
设置table存储位置
alter table XXX cache;
设置table是否cache


SQL> alter table ACCTTXNLOG storage(buffer_pool DEFAULT);

Table altered.

SQL> select table_name,CACHE,BUFFER_POOL from user_tables where table_name='ACCTTXNLOG';

TABLE_NAME                     CACHE      BUFFER_
------------------------------ ---------- -------
ACCTTXNLOG                         Y      DEFAULT

SQL> select count(*) from ACCTTXNLOG;

  COUNT(*)
----------
         2


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'ACCTTXNLOG'




Statistics
----------------------------------------------------------
        165  recursive calls
          0  db block gets
         36  consistent gets
          0  physical reads
          0  redo size
        379  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          4  sorts (memory)
          0  sorts (disk)
          1  rows processed



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值