设为首页 加入收藏

TOP

11GConcepts(翻译第十四章)MemoryArchitecture(内存体系结构)(四)
2014-11-24 01:08:03 来源: 作者: 【 】 浏览:104
Tags:11GConcepts 翻译 十四 MemoryArchitecture 内存 体系结构
数据库从buffer cache中扫描一个buffer,然后没有找到,将它从磁盘中读取到内存。

\

正常情况下,通过cache hit访问数据要快于cache miss。buffer cache hit ratio(率)度量了数据库在内存中找到而不需要从磁盘中读请求的块的比例。

数据库在数据文件或 temp 文件(临时)中都会执行physical reads

从数据文件中读,后面将跟随一个logical I/O(逻辑读)。

从临时文件中读,经常发生再当内存不足时强制数据库将数据写入到temporary table(临时表)然后在之后将其读回,这种物理读将不通过buffer cache 以及不会引起logical I/O。

Buffer Touch Counts(buffer触摸计数)

数据库通过使用touch count来测量LRU上buffers被访问的频率。使用了这个机制,数据库通过当一个buffer被pinned时增加计数这种方式来替换在LRU列表上频繁把buffer移来移去。

注意:数据库并不是物理的在内存中把块移来移去。这个移动是指改变其在LRU列表上改变其指针的位置。

当一个buffer被pinned时,数据库将确定它touch count最后一次增加是什么时候。如果最后增加的时间超过了三秒,那么count将增加,否则,count将不会发生变化。这个三秒规则预防了在buffer上突发大量的pin导致增加了非常多的touch。举个例子,一个会话可能插入一个块中的多个行,但是数据库将把这些插入动作认为是一个touch。

如果一个buffer在LRU的冷端,但是它的touch count很高,那么这个buffer将移到热端,如果touch count很低,那么buffer将从内存中被换出。

Buffers and Full Tables Scans(buffers以及全表扫描)

当buffers必须从磁盘中读取,那么数据库将把这些buffers插入到LRU列表的中间。从这个方面看,热块可以保留在内存中,这样它们就不需要再次从磁盘中读取了。

full table scan将会造成一个问题,它会顺序读取在表高水位下的所有行。假设这个segment的大小大于buffer cache的大小,那么这个表的full scan可能会把整个buffer cache给清空,使得数据库不能将频繁访问的块维护在内存中。

大表全表扫描的块的读取方式,不同于其他读取方式。这些块在使用完后可以立即被重用,用来有效防止将整个buffer cache给清空。

在一些极少数情况,这种默认的行为并不是合理的,你可以通过修改表的CACHE属性。这种情况下,数据库不会把块强制或者pin到buffer cache中,但是它们会其他块被换入换出的方式一样。小心使用这个选项,因为超大表的全表扫描可能会把buffer cache中的绝大部分其他buffer给清理出去。

Buffer Pools

Buffer pool是由一组buffers组成。数据库的buffercache可分为一个或多个buffer pools。

你可以手工单独设置不同的buffer pool,这些pool要么是将数据keep在buffer cache 要么是里面的数据使用完后可立即被新数据使用。你可以分配指定的schema object到合适的buffer pool中,用来控制它的块被换出的方式。

有以下几种pool:

·Default pool(默认池)

这种池就是普通池,除非你手工配置了其它pool,否则default pool就是唯一的buffer pool

·Keep pool(保持池)

这种池是为访问频繁但总因为默认池空间狭小总被换出的块准备的,keep pool的目标是将对象保留在内存中,用来避免I/O操作。

·Recycle pool(回收池)

这种池为不会频繁使用的块准备的。Recycle pool防止一些不必要对象在cache中消耗空间。

数据库有标准的块大小,但是你可以创建表空间块大小不同于标准块大小。每个非默认的块大小都有一个它自己的pool。Oracle数据库管理这些池中的块的方式和默认池中的一样。

下图显示了当使用了多池时的buffer cache的架构。Cache中包含default,keep以及recycle pools。默认的块大小是8KB。Cazhe总还包含了因为使用了非标准块大小的表空间而设置的2KB,4KB以及16KB的池。

Redo Log Buffer

Redo log buffer是在SGA中的一个循环buffer,它存放了redo条目,这些条目描述了数据库中的修改。Redo entries(redo条目)包含重构或重做数据库中所做的修改(通过DML或DDL)。数据库在recovery过程中会应用redo entries到数据文件去重构丢失的更改。

Oracle数据库进程从UGA中将redo条目拷贝到SGA中的redo logbuffer。Redo条目按照连续,顺序的方式获取buffer中的空间。后台进程log writer(LGWR)将redo log buffer中内容写到磁盘上的active online redo log group(状态为active的在线重做日志组 )。下图显示了redobuffer的活动情况。

\

LGWR是顺序写入磁盘而DBWn是离散(随机)写入磁盘。随机写往往比顺序写慢多了。LGWR使得用户避免了DBWn完成它的缓慢写入,这样数据库提供了更好的性能。

LOG_BUFFER初始化参数指定了Oracle存放redo 条目的内存大小。和SGA中其他组件不同,redolog buffer以及fixed SGA buffer不会将内存细分为granules。

Shared Pool

Shared pool缓存了多重程序数据的类型。举个例子,sharedpool存储了解析之后的SQL,PL/SQL代码,系统参数,以及数据字典信息.数据库中出现的每个操作几乎都会涉及到shared pool.举个例子,如果用户执行一个sql语句,那么oracle数据库访问shared pool。

Shared pool细分为几个组件,其中最重要的如下图显示

\

这一节包含下面几个标题:

·Library Cache

·Data Dictionary Cache

·Server Result Cache

·Reserved Pool

Library Cache

Library cache是个shared pool中的内存结构,它存储了可执行的SQL和PL/SQL代码。这个cache包含shared SQL/PL/SQL area 以及如locks或librarycache handles等控制结构。在shared server结构中,library cache同样把private SQL area也包含进来了。

当一个SQL语句执行时,数据库将尝试重用之前执行过的代码。如果在library cache中解析过的该SQL存在,以及可以共享使用,那么数据库将重用这些解析后的代码,称之为soft parse(软解析)或者library cache hit。如果没有存在,那么数据库就必须创建一个应用代码的可执行版本。这个过程称之为hard parse(硬解析)或library cache mis

首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇禁止以操作系统认证方式登录数据库 下一篇全面解析Oracle数据库的系统和对..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: