Oracle的Buffer Cache是用于缓存数据库块的空间,缓存的是读取原始磁盘数据的数据块。尽管Oracle采用了许多优化技术来最小化磁盘I/O,但是仍然需要载入磁盘数据块。Buffer Cache的目的是尽可能减少读取原始磁盘数据的操作,并将这些块保留在内存中用于以后的访问。
缓存是通过物理内存的分别来处理的,但实际上是通过Oracle进程处理的。有些进程被称为DBWR(数据库写进程),它们负责将修改后的块都写回到硬盘,有些被称为DBW0,它是将缓存中最旧的块刷回磁盘的化身。缓存是实现缓解磁盘I/O的一个重要手段。
不同的Oracle版本使用不同的块大小。在Oracle8中,块的大小通常是2Kb到16Kb。在Oracle9i中,默认块大小增加到8Kb到32Kb。在新版本中使用的块大小更大。从Oracle10gR1开始,默认块大小增加到是4K到32K。从版本11gR2开始,可以使用大块(大于8K)高效地存储大型数据。
SELECT
NAME, CHILD_NUMBER, BYTES/1024/1024 "SIZE (MB)", BLOCK_SIZE
FROM V$SQL_SHARED_CURSOR
WHERE LOADED_VERSIONS >1
ORDER BY NAME, CHILD_NUMBER;
但一般来说,块越大而相对于查询数据给出的块位置大小更近,缓存就更有效,访问所需的硬盘I/O就越少。此外,以较大的块大小缓冲大型表时,Buffer Cache的效果也更明显;另外还可以增加SGA(内存)的大小。
缓存中的块可能与存储在其他块(委托缓存和固定缓存等)中的数据冲突。委托缓存可以分配大量内存来缓存大量数据。与此相反,固定缓存是为应用程序缓存数据而使用的。缓冲池大小也可能存在缺陷,如果过大,大块可能会被缓存而不使用,而如果过小,则可能会丢失大部分缓存,以致于缓存中的数据只是临时存储。
在处理数据库数据块时,Buffer Cache的角色是非常关键的。Oracle数据库中的每个单独块的大小不能超过DB_BLOCK_SIZE。缓冲池大小通常是主机内存的一小部分。缓存池的大小应该足够覆盖数据库中最近使用的全体书目的块大小。否则,在查询过程中,使用不常使用的块时就会写入硬盘。
SHOW PARAMETER SGA_MAX_SIZE;
现在许多应用程序都使用Oracle数据库,如银行系统,医院管理,诊断设备监控,能源管理等等。对于数据库,我们可以通过它来帮助管理应用程序,缓解磁盘 I/O ,以及增加性能,而在Oracle中,缓冲池就是其中的一个重要元素。