数据缓存区,database buffer cache,分为脏缓存区(dirty buffer)和可用缓存区(free buffer),分别使用的是待写列表和最近最少使用(LRU- least recent used)列表管理。
脏缓存区保存的是已经修改但是还未写入到磁盘的数据;
可用缓存区分为可用区和锁定区,可用区是干净无数据的,锁定区表示目前正在被使用;
当一个新进程访问一个数据,例如发出了一条select语句,那么oracle首先在缓存区搜索是否已经有存在所需要的数据,如果找到了那么就可以直接在内存访问数据,这个动作就中cache hit;
如果没用找到,那么需要从磁盘对应的数据文件中读入缓存中,这个动作叫做 cache miss,这个步骤涉及到了I/0操作;
从数据文件读入缓存区之前,需要先找到对应的空间来存放,oracle一直搜索缓存区(从LRU开始搜索),直到找到可用缓存区或者达到缓存区搜索操作的预设限定值为止,
在这个搜索过程中,遇到了一些脏数据,将会将它们移到待写列表,然后继续搜索,当找到可用缓存区后,进程将数据块从磁盘写入缓存区,并将此缓存区移到LRU列表的MRU端(most recent used);
如果一直都搜索不到可用区域,将激活DBW0进程去执行数据块写动作,将脏数据写入磁盘,以便腾出足够的空间给下次缓存区操作使用。
这既是一个大概的过程吧。
针对全表扫描的动作,和上述有所不同,全表(full scan)的读入的数据,oracle认为这是暂时、临时需要的数据,因此从磁盘读入的时候将被放到LRU列表的LRU端,以便最快的被移除LRU。
-The End-