SGA(SYSTEM Global Area )系统全局区
l 数据高速缓存
在Oracle进行数据处理的过程中,代价最昂贵的就是物理 I/O操作了。同样的数据从内存中得到要比从磁盘上读取快的多。因此,优化Oracle的一个重要的目标就是尽可能的降低物理 I/O操作。
Oracle的 Buffer Cache用于缓存从磁盘中读取的数据,当 Oracle需要查找某些信息的时候,首先会在 BufferCache中寻找,如果找到了,则直接将结果返回。如果找不到,则需要对磁盘进行扫描, Oracle将在从磁盘扫描得到的结果返回的同时,会把这些数据在Buffer Cache中也保留一份,如果下次需要访问相同的数据块的时候,则不需要再次扫描磁盘,而是直接从 Buffer Cache中读取即可。
2 数据高速缓存由初始化参数DB_CACHE_SIZE指定大小,由许多大小相等的缓存块组成,这些缓存块的大小和OS块大小相同。这些缓存块分为 3 大类:
n 脏缓存块(Dirty buffers ):
脏缓存块中保存的已被修改过的缓存块。即当一条SQL语句对某个缓存块中的数据进行修改后,该缓存块就被标记为脏缓存块。最后,脏缓存块被DBWn进程写入到硬盘的数据文件中,永久保留起来。
n 命中缓存块(Pinned buffers ):
命中缓存块中保存的是最近正在被访问的缓存块。它始终被保留在数据高速缓存中,不会被写入数据文件。
n 空闲缓存块(Freebuffers):
该缓存块中没有数据,等待被写入数据。oracle从数据文件中读取数据后,寻找空闲缓存块,以便写入其中。
2 标准数据库缓冲区缓存分为以下三种:
n 保持(keep)缓冲池:长期保存在内存中,直到数据库被关闭为止,其大小由BUFFER_POOL_KEEP指定。
n 再生(recycle)缓冲池:数据一旦用毕后就被换出内存中,其大小由BUFFER_POOL_RECYCLE指定。
n 默认(default)缓冲池:数据使用LRU调度算法来换出,其大小由DB_CACHE_SIZE 决定。
2 工作原理和过程LRU(最近最少使用 Least Recently Used )。Oracle通过 2 个列表(DIRTY、LRU)来管理缓存块。
n DIRTY 列表中保存已经被修改但还没有被写入到数据文件中的脏缓存块。
n LRU 列表中保存还没有被移动到DIRTY列表中的脏缓存块、空闲缓存块、命中缓存块。当某个缓存块被访问后,该缓存块就被移动到LRU列表的头部(Most Recent Used, MRU端),其他缓存块就向LRU列表的尾部(Least Recently Used, LRU 端)移动。放在最尾部的缓存块就最先被移出LRU列表。
说明:如果用户执行的是全表扫描的操作,这些操作产生的数据缓冲不会放到 LRU端的 MRU端,而是放到LRU端。因为Oracle认为全表扫描得到的数据只是暂时的需要,这些数据以后被重用的机会很少,应该快速的清除出缓冲区,把空间留给其他的更常用的数据。可以在表的级别上改变这种处理方式。在建表的时候指定Cache语句会使得这张全表扫描得到的数据也放在 LRU链表的 MRU端。
n 数据高速缓存的工作原理过程是:
A、ORACLE在将数据文件中的数据块复制到数据高速缓存中之前,先在数据高速缓存中找空闲缓存块,以便容纳该数据块。Oracle 将从LRU列表的尾部开始搜索,直到找到所需的空闲缓存块为止。
B、如果先搜索到的是脏缓存块,则将该脏缓存块移动到DIRTY列表中,然后继续搜索。如果搜索到的是空闲缓存块,则将数据块写入,然后将该缓存块移动到DIRTY列表的头部。
C、如果能够搜索到足够的空闲缓存块,就将所有的数据块写入到对应的空闲缓存块中。则搜索写入过程结束。
D、如果没有搜索到足够的空闲缓存块,ORACLE就先停止搜索,激活DBWn进程,开始将DIRTY列表中的脏缓存块写入到数据文件中。
E、已经被写入到数据文件中的脏缓存块将变成空闲缓存块,并被放入到LRU列表中。执行完成这个工作后,再重新开始搜索,直到找到足够的空闲缓存块为止。
2 KEEP池和 RECYCLE池的使用
如果内存足够大,可以容纳所有的数据,则访问任何数据都可以从内存中直接获得,那么效率肯定是最高的。但是在实际应用当中,经常是数据库的大小达到了几百个 GB甚至是几个 TB,而 Oralce的可用内存只有几个 GB大小。缓存中缓存的数据只能占到整个数据库数据的很小一部分,因此,这就要求必须合理的分配内存的使用。
如果可使用的内存空间比较小,导致数据库缓冲区的命中率比较低,则可以通过配置 KEEP池和 RECYCLE池,把性质不同的表分离到不同的数据缓冲区,以提高命中率,降低此操作对正常访问的影响。
默认情况下,所有的表都是用 default池,它的大小就是缓冲区Buffer Cache的大小,由初始化参数 db_cache_size来决定。如果在建表或者修改表的时候指定 STORAGE(BUFFER_POOLKEEP)或者 STORAGE(BUFFER_POOLRECYCLE)语句,就设置这张表使用 KEEP或者 RECYCLE缓冲区。这两个缓冲区的大小分别由初始化参数 db_keep_cache_size和db_recycle_cache_size来决定。
通过下面的sqlplus命令查看带“cache_size”字符串的系统参数值
SQL> show parametercache_size
结果如下:
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 --属于SGA自动管理组件,值为0.
db_keep_cache_size big integer 0
db_recycle_cache_size big integer 0
SQL> alter system set db_keep_cache_size=16Mscope=both;
SQL> alter system setdb_recycle_cache_size=16M scope=both;
SQL> show parametercache_size
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 --属于 SGA自动管理组件,值为0.
db_keep_cache_size big integer 16M
db_recycle_cache_size big integer 16M
n KEEP池
KEEP池用来缓存那些经常会被访问的表。
KEEP池使用缓冲区独立于DEFAULT池,因此把最经常使用的表缓存到单独的缓冲区中,使得数据库的其他操作,如执行大量批操作也不会影响到这些在 KEEP缓冲区中的表,保证访问这些最常使用的表的数据时