SGA(system global area)系统全局区域,在内存中分配一份共享内存区域为oracle的一些关联进程运行所共享。如DBWn,PMON。
SGA分为有以下几部分组成:
1.高速缓存区
2.重做日志缓存区
3.共享池
4.大池
5.java池
6.流池
7.固定SGA
高速缓存区
高速缓存区的主要作用于缓存从数据文件中读取的数据块。当用户请求数据时,oracle会从高速缓存区中检索,如果检索到了对应的数据块即缓存命中,oracle便会直接从缓存区中读取数据。如果没有命中,oracle的读进程会从数据文件中读取对应的数据块,将对应的数据块加入到缓存区中。oracle中缓存区中对应块存在未使用,干净和脏块这三种状态。未使用是指对应的区域没有缓存任何数据,干净状态是指区域中缓存中数据和数据文件中的数据一致状态,脏状态指定是缓存区缓存的数据已被修改和数据文件中的数据不一致。oracle从数据文件中读取的数据块置换的是处于干净状态和未使用状态的缓存中区域。
oracle会在特定是时间点会将高速缓存区中的脏数据和冷端中数据同步到数据文件中。oracle利用的是LRU(最近最少)原则来区分是该数据块处于冷端还是热端中。触发DBWn同步数据文件的条件:
1.缓存区中处于干净状态或者未使用状态中的区域低于某一个阈值的时候。
2.需要推进一个检查点。如做切换日志以及ALTER SYSTEM CHECKPOINT命令
3.数据表空间处于readonly,offline
在缓存区中oracle利用LRU的原则来辨别数据块处于冷端还是热端。使用访问触摸器来记录这个区域数据的访问次数,来区别这个数据是出于冷端还是热端。缓存区中的值的数据块可以处于订住状态,以便用户的再次访问。订住状态的实现也是通过访问触发器来实现的,正常情况下每隔3秒会触发一次访问记录器。
缓存池:
高速缓存区中可以存在多种类型的缓存池,默认情况下只有一个缓存池,对应的为配置参数文件中对应的默认的数据块的大小为db_block_size参数设置。如果在创建表空间时设置的块的大小有别于db_block_size设置的参数时,这时候就需要在参数文件中设置对应的缓存池。由参数DB_nk_CACHE_SIZE配置,n对应的是就是对应的块的大小单位是kb。除了以上几种缓存池外还存在有keep池和循环池。
keep池用长期保持缓存区中的数据使其不会被换出
循环池缓存不被频繁使用的数据块