数据缓存区(database buffer cache)中的缓冲区(buffer)通过两个列表管理:
1 待写列表(write list)
2 最近最少使用列表(least recently used(LRU)list)
待写列表中记录的是脏缓冲区(dirty buffer),即其中数据已被修改且尚未写
入磁盘的缓冲区。最近最少使用列表中记录的是可用缓冲区(free buffer),
锁定缓冲区(pinned buffer),及还没被移入待写列表的脏缓冲区。可用缓冲
区内的数据无需继续保留,可以用于存储新数据。而锁定缓冲区是正在被访
问的缓冲区。
LRU链分为最近使用端mru和最近最少使用端lru两端
当某个 Oracle 进程访问一块缓冲区时,就会将其移动到 LRU 列表的最近使用
(most recently used,MRU)端。随着更多被访问的缓冲区移动到 LRU 列表
的 MRU 端,较早前被访问过的脏缓冲区就会逐渐向 LRU 列表的 LRU 端移
动。
PGA发生物理读的情况
当 Oracle 的用户进程(user process)首次查询某块数据时,她将首先在数据
缓存区内进行搜索。如果用户进程在数据缓存区内找到了所需的数据(称为
缓存命中(cache hit)),就可以直接从内存中访问数据。如果用户进程不能
在数据缓存区中找到所需的数据(称为缓存失效(cache miss)),则需要从
磁盘中的数据文件里将相应的数据块复制到缓存中才能进行访问。缓存命中
时的数据访问速度远远大于缓存失效时的速度。
用户进程将数据块读入数据缓存区之前首先要准备好可用缓冲区。用户进程
从 LRU 列表的 LRU 端开始对其进行搜索。这个搜索过程将一直持续,直到
找到可用缓冲区或达到缓存搜索操作的预设限定值为止。
当用户进程在对 LRU 列表的搜索过程中遇到脏缓冲区时,她会先将此类缓冲
区移入待写列表,之后再继续搜索。当用户进程找到了可用缓冲区时,就会
将数据块从磁盘写入缓冲区,并将此缓冲区移到 LRU 列表的 MRU 端。
如果 Oracle 用户进程对 LRU 列表的搜索操作达到了预设的限定值而仍旧没有
找到可用缓冲区,那么进程将停止搜索并通知 DBW0 后台进程将部分脏缓冲
区写入磁盘。
当用户进程(user process)执行全表扫描(full table scan)时,她会将存储表
数据的数据块读入缓冲区,并将这些缓冲区移动到 LRU 列表的 LRU 端(而
不是 MRU 端)。这是因为全表扫描得到的数据通常只是暂时需要的,因此
这些缓冲区应当被尽快地移出数据缓存区,为其他使用频率更高的数据块腾
出空间。
用户可以针对每个表而设定全表扫描时缓冲区的使用方式。具体做法是,在
创建(create)或修改(alter)表或簇(cluster)时使用 CACHE 子句,设定在
对此表进行全表扫描时将其数据块读入 LRU 列表的 MRU 端。用户可以对数
据量较小的检索表(lookup table)或数据量较大的静态历史表(static
historical table)进行此项设定,以避免访问此类表导致额外的 I/O 操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10678398/viewspace-715111/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10678398/viewspace-715111/