1.摘要
Data_buffer_cache用来保存频繁访问数据的内存缓冲域,以便于oracle用户进程需访问某块数据而首先到data_buffer_cache中寻找能够找到(cache hit),从而大大减少从磁盘读取数据所需要的IO时间(减少物理IO)。
★ oracle以hash算法快速定位所需命中缓存块clean buffer在 hash chain(hash bucket)上 是否存在;
★ oracle以write list待写链表快速定位已被修改,但尚未写入磁盘的脏缓存块dirty buffer;
★ oracle 以LRU list(least recently used)最近最少使用列表,来快速定位可用数据块,包含命中缓存块clean buffer,空闲缓存块free buffer
★ LRU list 上还包含不可用缓存块pin buffer及未来得及移入write list的脏块。
>查看data_buffer_cache大小
SQL> select current_size from v$buffer_pool;(当前分配大小)
CURRENT_SIZE
------------
16640
SQL> show parameter db%cache_size;(查最低分配值,ASMM下)
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size big integer 0
db_2k_cache_size big integer 0
db_32k_cache_size big integer 0
db_4k_cache_size big integer 0
db_8k_cache_size big integer 0
db_cache_size big integer 0
db_flash_cache_size big integer 0
db_keep_cache_size big integer 0
db_recycle_cache_size big integer 0
SQL> show parameter db_block_size;(查默认内存块大小)
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
2.DB_buffer_cache四部分结构
default pool,keep pool,recycle pool,db_nk_cache_size
3.Default pool
数据库对象未特别指定时所使用的默认缓冲池,分别以不同的算法处理缓冲区数据,使缓冲数据能尽量长或尽短时间地占用default pool缓冲区。
★工作方式:
当oracle进程访问一块缓冲区后,会将该缓冲区移动到LRU列表的MRU段(Most recently used),随着更多被访问的缓冲区移动到LRU列表的MRU段,较早前被访问过的缓冲区就会逐渐向 LRU列表的LRU(least recently used)端移动。
当用户user process执行FTS全表扫描(full table scan)时,数据首次将会从磁盘读入缓冲区,之后将该缓冲区移动到LRU列表的LRU端而非MRU段,以使得这些通过通常只是暂时需要的全表扫描数据所占用的缓冲区能被尽快地移出数据缓冲区,为其他使用频率更高的数据块腾出空间。
当对小表查询部分数据时,oracle也趋向于执行FTS,若确定该表数据确实需要进行缓冲时,为了避免数据仍按默认规则被放到LRU的LRU端,可使用表的cache特性将该表上的FTS数据指定放到MRU端。
oracle默认扫描数据为整数据的10%以上为FTS
▲ 查看当前分配的大小
SQL> select component,current_size from v$sga_dynamic_components where component='DEFAULT buffer cache';
COMPONENT CURRENT_SIZE
---------------------------------------------------------------- ------------
DEFAULT buffer cache 335544320
SQL> select name,current_size from v$buffer_pool;
NAME CURRENT_SIZE
-------------------- ------------
DEFAULT 320(M)