众 所周知,读取磁盘的速度相对来说是非常慢的,而内存相对速度则要快的多。因此为了能够加快处理数据的速度,oracle 必须将读取过的数据缓存在内存里。而这些缓存在内存里的数据就是数据库缓冲区高速缓存区,通常就叫做 Buffer Cache。按照 oracle 官方的说法,Buffer Cache 就是 SGA 中一块含有许多数据块的内存结构,而这些数据块主要都是数据文件里的数据块内容的拷贝。相信如能更好的掌握该区域的所有特性,对于数据库的优化能力会有显著提升。一起来搞事情吧小伙伴!
数据库缓冲区高速缓存的功能
优化物理 I/O
Database Buffer Cache 存放从数据文件中读取出来的数据块,也缓冲系统正在使用或者最近使用完的数据块。所有连接到数据库的用户,都可以共享该内存区域。并缓存应用修改后的脏块,并在脏块生成前产生 redo 日志,之后
commit
,数据库将 redo 写入磁盘,但不会立即将脏数据块写入磁盘。通过检查点进程(CKPT)来协调,这样可以提高物理 I/O 的写入效率。
将频繁访问的块保留在缓冲区缓存中,并将不常访问的块写入磁盘
缓冲区状态(Buffer States)
没用过(Unused)
表示缓冲区可供使用,因为它从未被使用或当前未被使用。这种类型的缓冲区是数据库最快使用的;
清洁(Clean)
表示缓冲区较早已被使用,现在包含一个时间点的块的读一致版本。该块包含数据,但是“干净”,所以它不需要检查点。数据库可以固定块并重新使用它;
脏(Dirty)
表示缓冲区包含尚未写入磁盘的已修改数据。数据库必须在重新使用该块之前执行检查点。
每个缓冲区都有一个访问模式:pinned or free - 固定或空闲(未固定)。缓存被“固定”在缓存中,以便在用户会话访问内存时不会耗尽内存。多个会话不能同时修改固定的缓冲区。
缓冲模式(Buffer Modes)
当前模式(Current mode)
如果未提交的事务已更新块中的两行,则当前模式将检索具有这些未提交行的块。修改语句只能更新块的当前版本。
一致模式(Consistent mode)
如果未提交的事务更新了块中的两行,并且如果单独会话中的查询请求该块,则数据库使用撤销数据来创建此块的读一致版本不包括未提交的更新。通常查询以一致模式检索块。
缓冲区 I/O(Buffer I/O)
当在内存中未找到请求的缓冲区时,数据库执行物理 I / O 以将缓冲区从闪存缓存或磁盘复制到内存中,然后执行逻辑 I / O 以读取缓存的缓冲区。
缓冲区写入(Buffer Writes)
DBWR 在下列情况下写入缓存:
1. 服务器进程无法找到用于将新块读入数据库缓冲区的干净缓冲时;
由于缓冲区变脏,空闲缓冲区的数量减少。如果该数字低于内部阈值,并且如果需要干净的缓冲区,则 DBWn 开始将缓冲区写入磁盘。
数据库使用 LRU 来确定要写入哪些脏缓冲区。当脏缓冲区到达 LRU 的冷端时,数据库将它们从 LRU 移到写队列。DBWn 将队列中的缓冲区写入磁盘,如果可能的话,使用多块写入。该机制可防止 LRU 的末端被脏缓冲区堵塞,并允许找到干净的缓冲区以供重用。
2. 数据库执行检查点;
3. 表空间更改为只读状态或脱机。
当用户进程请求一个缓冲区时,服务器进程搜索缓冲区缓存中的缓冲区。一个高速缓存命中,如果数据库查找内存中的缓冲区发生。搜索顺序如下:
1. 服务器进程搜索缓冲区缓存中的整个缓冲区。
如果进程发现整个缓冲区,则数据库执行该缓冲区的逻辑读取。
2. 服务器进程在闪存缓存 LRU 列表中搜索缓存头。
如果进程找到缓冲区头部,那么数据库将从缓冲区主体执行优化的缓冲区物理读取将高速缓存存储到内存中的高速缓存中。
3. 如果进程未找到存储器(缓冲区高速缓存未命中),则该服务器进程执行以下步骤:
a. 将数据文件中的块复制到内存中(物理读取)
b. 对读入内存的缓冲区执行逻辑读取
下图为缓冲区搜索示意图:
缓冲池(Buffer Pool)
数据库缓冲区缓存分为一个或多个缓冲池。可以手动配置将数据保存在缓冲区缓存中的独立缓冲池,或者在使用数据块后立即使缓冲区可用于新数据。
默认池(Default Pool)
除非手动配置单独的池,否则默认池是唯一的缓冲池。
SQL> show parameter db_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_size big integer 400M
保留池(Keep Pool)
保留缓冲池的目标是将常用对象保留在内存中,从而避免大量物理 I / O 操作。
SQL> show parameter db_keep_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_keep_cache_size big integer 300M
回收池(Recycle pool)
这个池适用于大范围数据的单次操作缓冲,在使用后可快速释放缓冲池,避免消耗不必要的内存空间。
SQL> show parameter db_recycle_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recycle_cache_size big integer 0
非标准块大小表空间的独立池
SQL> show parameter cache 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