快速深入地掌握和管理数据库系统-第三章
 
2009-01-13 来源:chinaunix.net
 

第三章 内存管理

数据库系统有自己的内存管理和调度,在内存中完成用户数据地处理和维护。系统的整个内存空间在启动时分配,依据存放数据和功能的不同,被划分为多个部分,每个部分分别使用单独的页表进行请求调页管理、请求淘汰换页管理。一个数据库系统可以使用多个页尺寸读取磁盘中的数据。

了解和掌握数据库系统内存空间结构的划分和使用,是正确配置和管理内存的重要前提。不同数据库系统,尽管其内存结构存在差异,但也大体上一致。本章首先从整体上介绍系统需要使用的内存空间结构,然后就常用数据库系统的内存结构进行了讲解,并就有关配置参数进行了说明以方便用户对系统内存使用的管理。

3.1 用户请求处理时的内存使用

在第2.1一节中,我们通过用户请求的处理过程,说明数据库系统包含那些进程模块。这里,我们仍旧使用这个例子,来说明数据库系统内存空间的使用。

(1)首先,数据库系统启动的所有进程模块,都需要一块内存空间,存放它的执行代码、堆栈、控制信息等,这块内存空间称为进程缓冲区。代理进程由于需要建立和客户端应用程序的连接,接收和处理用户请求并返回处理结果,因此它的进程缓冲区还需要另外的内存空间,存放用户会话信息,进行数据的排序操作等。

(2)代理进程接收到用户请求,在请求被处理之前需要将SQL语句交给优化器进程,进行以下的处理:

① 语法分析。根据表、索引、视图等数据库对象的定义,检查SQL语句是否存在语法错误。

② 授权检查。根据数据库系统中的授权信息,决定用户是否有权限执行该SQL语句。

③ 生成执行计划。根据数据库对象上的统计信息,生成该SQL语句费用最低的执行计划。

所有这些要查询的信息存放在数据库的数据字典中。由于数据库系统经常需要访问这些数据,因此系统启动时需要创建一块内存空间,存放这部分数据。这块内存空间被称为数据字典缓冲区。

(3)优化器进程在生成SQL语句的执行计划后,可以将该执行计划存放在内存缓冲区中。这样在下一次重新执行该SQL语句时,就不用再次进行分析、优化,提高了用户请求的处理速度。这样的一块内存空间被称为SQL语句缓冲区。

(4)代理进程执行用户请求,首先要将相关用户数据读入内存,在内存中完成查询、更新处理、生成各种汇总信息等,所有被更新数据最后由页清除进程写入磁盘。这部分内存空间被称为用户数据缓冲区,在整个系统的内存空间中要占用最大的份额,对系统性能的好坏有着重要的影响。

(5)由于数据库中数据为多个用户所共享,可能有多个用户要访问相同的数据。为了保证数据的完整性,任何用户请求在被处理之前,都要根据执行的内容对数据加相应的锁。存放锁的内存空间被称为锁表缓冲区。

(6)数据库以事务的方式处理用户请求,所有的处理都要产生日志,这些日志信息最先放置在内存中,最后由日志写进程写入磁盘。存放日志信息的内存空间被称为日志缓冲区。

3.2 数据库系统的内存结构

从第3.1节,我们知道一个数据库系统应当包括以下的内存结构:进程缓冲区、数据字典缓冲区、用户数据缓冲区、SQL语句缓冲区、日志缓冲区、锁表缓冲区。当然,除此之外,特定数据库系统还会根据自身需要,建立其它的内存结构。

在这些内存结构中,每一个进程都需要一个进程缓冲区,进程缓冲区为单个进程所拥有,只能为进程本身所使用,因此被称为私有内存空间。除进程缓冲区之外,其它的内存结构被共享使用,系统中所有进程都可以访问,更新其中的数据。由于这些内存结构为所有进程所共享,因此统称为共享内存空间。

3.2.1 进程缓冲区

进程缓冲区是进程的私有内存空间。进程启动时,系统就为进程分配进程缓存区。在进程运行过程中,进程缓冲区为该进程排它性地使用,系统不能将该内存空间用作他用。一旦进程正常完成后退出或者异常中止后,对应的进程缓冲区就被系统收回。

进程缓冲区和进程之间一一对应,密切相关,它用来存放进程控制块、堆栈、数据、程序代码等进程运行所需要的相关信息。

对代理进程来说,由于要建立和客户端应用程序的连接、处理SQL语句等,除了一般进程运行所需要的相关信息之外,还需要内存空间保存用户会话信息、执行排序操作等。如果代理进程和客户端应用程序一一对应,则会话信息、排序操作等所需要的内存空间就放置在进程缓冲区中。如果一个代理进程为多个客户端应用程序所共享,则会话信息、排序操作等所需要的内存空间就存放在共享的内存空间中。

对于多线程的数据库系统,其线程的内存空间使用类似以上的处理方式,每一个线程都有自己的线程缓冲区。所不同的是,线程在启动时,不是从系统、而是从所属进程的可用内存空间中获取线程缓冲区。对代理线程来说,其用户会话信息、排序操作等所需要的内存空间就存放在共享的内存空间中。

3.2.2 数据字典缓冲区

数据字典缓冲区,用来存放数据库的数据字典信息,在数据库系统启动时分配,是共享内存空间,所有进程都可以访问。

数据字典是数据库的一个重要组成部分,是对数据库本身作详细说明的数据集。系统维护人员对数据库系统地维护,最终要反映在数据字典中;用户对数据库中数据的访问,需要通过数据字典返回结构化的信息。根据信息所起作用的不同,数据字典中的信息可以分为以下几类:

(1)数据库的物理结构。说明数据库使用了那些操作系统文件、裸设备,表空间如何被创建等等。

(2)数据库的逻辑结构。一个数据库包括:表、索引、视图、触发器、存储过程等结构,这些结构就是数据库对象。数据库的逻辑结构,就是对数据库对象的结构说明及定义。对一个表来说,在数据字典中要存放:表中的字段、字段的类型、字段中是否存在完整性定义、表中是否有索引、表中是否有外健等信息;此外,还要说明表存放在那个表空间中,系统如何为表分配存储空间等。

(3)用户定义及授权信息。保存可以访问数据库的用户信息,记录为不同用户设定的操作权限等。

(4)数据库对象的统计信息。这些信息,是对表、索引中存放的数据进行统计后得到的。优化器进程根据这些信息,生成SQL语句费用最低的执行计划。经常被使用的统计信息有:表中记录的数量、字段上数值的分布、表使用的数据页数量、索引的深度以及使用的数据页数量等等。

数据库系统对用户请求的处理过程,可以清楚地说明数据字典的关键作用。当数据库系统接收到用户的SQL语句请求后,首先需要获取SQL语句的执行计划,然后按照执行计划处理数据,最后将结果返回。要获取SQL语句的执行计划,优化器需要按照以下的步骤,对SQL语句进行分析、优化:

(1)验证SQL语句是否存在语法错误。以访问一个表来说,系统要检查是否存在这个表,表中的字段是否相符、数据类型是否匹配、是否违反字段的完整性定义、是否违背唯一索引限制、是否违背参照完整性等等。

(2)检查发出请求用户的执行权限。根据SQL语句要执行的操作,检查用户是否有相应的操作权限。不仅要检查用户获得的直接授权,还要检查所有可能的隐含授权。对视图的访问来说,不仅要检查用户是否有访问该视图的权限,还要检查视图所基于数据表的访问权限。

(3)选择SQL语句的执行计划。优化器首先生成SQL语句的所有执行方式,根据数据库对象的统计信息,评估所有的执行方式,选择费用最低执行方式为该SQL语句的最终执行计划。

从以上的处理过程,可以明确地看出数据字典的重要作用。由于数据字典信息要不断被使用,因此应当避免在系统的正常运行过程中,不断地将数据字典信息读出和读入内存,这可以通过加大数据字典缓冲区的内存空间而实现。

3.2.3 用户数据缓冲区

用户数据缓冲区,是一块共享内存空间,在数据库系统启动时分配,用来存放数据库中的用户数据。这些用户数据在需要时由代理进程读入内存,在被更新后最终由页清除进程写入磁盘。

数据字典信息是对数据库本身的描述,可以看作是系统数据;数据库的用户数据,是用户业务处理过程中产生的各种信息,这些信息存放在数据库的各种用户表中,用户的业务处理也就是对这些信息进行更新和查询。

用户客户端的应用程序通过数据库系统的代理进程,实现用户数据的更新和查询。代理进程在内存中完成对用户数据的处理,处理时首先检查需要的数据是否处于内存中。如果不能在内存中找到,就从磁盘中读入。因此,保证要处理的用户数据已处于内存中,将会提高用户请求的处理和响应速度。然而,用户数据缓冲区的内存空间总是远远小于数据库中数据量的大小,为当前要处理的用户数据分配内存空间,不可避免要将原来的用户数据写入磁盘。数据库系统采用LRU(least recently used)算法,在需要用户数据缓冲区中的可用内存空间时,总是释放最近很少被访问数据所占用的空间。

对用户数据缓冲区的配置和管理,已经成为数据库系统性能的关键。不同的数据库系统使用了不同的管理策略,我们会对它们进行一个详细的描述。

3.2.4 SQL语句缓冲区

SQL语句缓冲区,在数据库系统启动时分配,用来存放由优化器生成的SQL语句执行计划。对反复被使用的SQL语句,可以避免被多次分析、优化。

SQL语句在被执行前,首先要由优化器进行语法分析,然后根据统计信息,生成执行计划。这一操作既花费时间、消耗系统资源,又降低了用户请求的响应时间。

尽可能减少优化器对SQL语句的分析、优化次数,是数据库系统提高处理能力的一种必然方式。其中一种实现方法就是使用SQL语句缓冲区,将SQL语句经优化器分析、优化过的执行计划,保存在这一内存空间中。

我们知道,应用系统中有许多相同、相似的SQL语句被反复地调用、执行,将这些SQL语句第一次执行时生成的执行计划,存放在内存中,随后的执行就可以直接使用,不用重新生成,从而可以有效地减少优化器的分析、优化次数。

为了使用SQL语句保存在内存中的执行计划,代理进程在处理SQL语句时,首先查看SQL语句缓冲区,如果发现和该SQL语句相匹配的执行计划,就直接使用它,否则就交由优化器分析、优化。

数据库对象当前的结构、统计信息,被用来找出SQL语句费用最低的执行计划。如果这些信息发生了改变,SQL语句存放在内存中的执行计划就失效。随后对同一个SQL语句的处理,会重新由优化器进行分析、优化,生成执行计划。因此,为避免SQL语句的再次编译,应不要在数据库系统正常运行时对系统进行维护,如更改表的字段、在表中增加索引、生成表的统计信息等。这些工作可以放在业务不繁忙时进行,比如夜间。

3.2.5 日志缓冲区

日志缓冲区,用来存放事务执行过程中产生的日志信息。该缓冲区在数据库系统启动时分配,所存放信息最后由日志写进程写入磁盘。

数据库以事务的形式操作数据,所有对内存中数据的更新都要产生日志,以方便数据库的恢复。日志信息不可能一产生就写入磁盘,它首先存放在内存中。

代理进程在处理事务时,生成的日志信息最初存放在进程的私有内存空间中。在事务提交、或者进程的私有空间不足时,会将这些日志信息导入日志缓冲区中。这样一方面可以避免代理进程对日志缓冲区的竞争,另一方面由日志写进程统一写磁盘,避免代理进程直接对磁盘进行I/O操作。

3.2.6 锁表缓冲区

锁表缓冲区,在数据库系统启动时分配,是一块共享内存空间,用来存放数据库系统中为数据库对象所加的锁。

数据库系统采用并发机制,同时为许多用户提供服务,这些用户可能需要同时操作相同的数据。为保证数据的更新操作不会丢失,在处理数据前系统要对数据加相关的锁。在更新完成后,这些锁才被释放。

代理进程在更新数据前,根据操作所需要的锁类型,检查锁表缓冲区,确认需要的锁是否能够获得。这分为两种情况:

(1)锁表缓冲区中没有相排斥的锁存在。代理进程在锁表缓冲区中加入锁,然后继续数据的处理。

(2)锁表缓冲区中存在相排斥的锁。在这种情况下,代理进程无法获得需要的锁,不能继续处理,要等待相排斥的锁被释放。如果在设定的锁等待超时时间达到后,代理进程仍旧没能获得锁,数据库系统就回退代理进程要处理的事务。

在事务处理完成后,系统为该事务分配的所有锁被释放,从锁表缓冲区中移走。

3.2.7 其它缓冲区

除以上缓冲区之外,数据库系统还会存在其它的内存结构,如:系统审计处理、备份和恢复操作等所使用的内存缓冲区。这些内存缓冲区,和其相关功能模块一样,并不是系统必须、需要经常使用的。我们这里不作进一步的说明。

3.3 内存的调度管理

内存管理是操作系统的五大功能之一,一个主要的任务就是内存空间的调度,为需要放入内存的数据分配空间,将不再需要的数据移出内存。对内存的管理,可以采用多种管理方式,主要有:分页存储管理、段式存储管理、段页式存储管理。由于分页存储管理,处理简单,实现方便,所以大多数操作系统都采用这种方式。

分页存储管理的基本原理,就是将内存空间分成大小相同的页,同时外部存储空间也按照相同的尺寸分页,数据以页为单位从磁盘读入内存,以页为单位从内存写回磁盘。使用页表对内存空间中的页进行管理。

内存页的调度管理,可以分为两个方面:(1)请求调页管理,(2)请求淘汰换页管理。

1. 请求调页管理

系统在处理数据时,首先检查所需数据是否已经调入内存。如果调入内存,则直接使用;如果没有调入内存,则产生缺页中断,以装入所需数据页。这就是请求调页管理。其缺页调度过程见图3-1。

请求调页管理的关键是确定内存中是否存在所需数据,这是使用页表来实现的。页表记录了放入内存中的数据,系统通过对这个表的查询,来决定所需数据页是否在内存中。如何实现页表的快速扫描,是操作系统必须要考虑的问题。另外,数据读入内存以及从内存中移走,都需要对页表进行维护,以反映内存中数据的真实情况。

2. 请求淘汰换页管理

请求淘汰换页管理,决定内存中那些数据被移走。由于内存空间总是小于磁盘空间,不可能将所有数据全部、同时地装入内存。在出现缺页中断并且内存中没有空闲的页时,就需要首先从内存中调出当前不再使用的数据页以释放空间。

对请求淘汰换页管理,可以使用多种页面调度算法,主要有:先进先出算法(first input first output,FIFO)、循环检测算法、最近最少使用算法(least recently used,LRU)、最优淘汰算法(optimal replacement algorithm,OPT)等等。

最近最少使用算法的出发点是:如果某页被访问,则该页可能再次被访问。或者反过来说,如果某页很长时间没有被访问,则该页在最近一段时间内也不会被访问。该算法被广泛使用,实现时也需要页表。通过页表中数据页的排列顺序,表明那些页最近被访问、那些页很长时间没有被访问。和最近最少使用算法相对应的是最近最多使用算法(most recently used,MRU)。

需要说明的是,对请求调页管理和请求淘汰换页管理所使用页表的维护,需要消耗系统资源。由于多个处理可能同时引起页表的更新,系统在更新页表前需要对页表加锁,以防止页表被破坏。也正是由于使用锁,系统中可能会存在页表的竞争,引起系统性能的下降。系统自动完成页表的维护,用户不能直接控制,但可以通过改变数据的使用方式,达到影响页表使用的目的。

3. 数据库系统的内存调度管理

对数据库系统来说,内存空间被划分为多个部分。除进程缓冲区之外,其他部分都是共享内存,每一部分都需要页表,以实现它的请求调页和请求淘汰换页管理。对系统的整个内存空间,按照功能的不同,划分为多个部分进行单独管理,减少了页表所管理内存空间的范围,能极大地提高页表的搜索速度,降低事务之间的互相竞争。

对请求调页管理,自然希望要处理的数据都已经调入内存,避免进程的等待。数据库系统提供了异步预取进程,在处理大数据量时可以事先将要处理数据读入内存。对请求淘汰换页管理,数据库系统采用了最近最少使用算法,通过将最近最少使用数据写入磁盘而获取内存空间。对该算法的实现,不同数据库系统有不尽相同的实现方式。

数据库系统中的大部分数据处理在用户缓冲区中完成,因此这部分内存空间的调度管理尤为重要。一些数据库系统公开了其请求淘汰换页管理的实现机制,用户可以通过配置参数的更改来影响它的执行动作。

如果数据库系统中存放用户数据的表空间使用了不同的页尺寸,就需要在系统中建立不同页尺寸的内存缓冲区,以存取这些表空间中的数据。这是内存的分页存储管理方式所决定的。

3.4 内存配置的一般原则

用户通过调整系统内存配置参数,来控制系统对内存空间的使用。尽管不同的数据库系统,其内存结构、管理方式会存在差异,但用户对系统内存的管理和配置,仍旧有一些原则可以遵循:

(1)一般不要改变进程缓冲区的配置。可以使用数据库系统的缺省配置,也可以打开数据库系统的自动配置功能,由系统根据需要进行调整。

(2)为数据字典缓冲区分配合理的内存空间,应当避免系统正常运行过程中,出现数据字典信息的读出和读入。

(3)尽可能保证代理进程需要的数据都能够在用户数据缓冲区中找到,用户数据缓冲区的数据命中率应当大于95%。

(4)SQL语句缓冲区的内存空间,应能够存放下被反复调用SQL语句的执行计划。

(5)对采用事务提交前必须将日志写入磁盘机制的数据库系统,可以设置较小的日志缓冲区;同样,采用事务提交前不要求将日志信息写入磁盘机制的数据库系统,就要求配置较大的日志缓冲区。

3.5 常用数据库系统的内存管理

了解和掌握数据库系统内存空间结构的划分和使用,是正确配置和管理内存使用的重要前提。不同的数据库系统,其内存空间结构的使用和管理也不尽相同。在这一节中,我们将就常用数据库系统的内存结构进行介绍,并就有关的配置参数进行说明。用户可根据自身需要,通过内存配置参数的调整,建立满足自己需要的系统运行环境。

由于用户数据缓冲区存放数据库中的用户数据,任何用户请求的处理都要用到这部分内存空间。因此它的配置和管理,对数据库系统的性能有着重要影响。为了能更好地使用用户数据缓冲区,我们将就系统对它的管理和使用进行单独介绍。

3.5.1 DB2数据库系统

1. 系统内存的空间结构

DB2系统的内存结构可以分为三个部分:数据库管理器内存、进程专用内存、数据库全局内存。进程专用内存是私有内存空间,是系统中进程使用的一块包含数据和控制信息的内存区域,在进程启动或创建时分配,并为进程排他访问。数据库管理器内存和数据库共享内存是共享内存空间,存放整个系统的管理信息以及数据字典、锁、要操作的用户数据等。具体的内存结构可见图1-3。

数据库管理器内存在实例启动时分配,而数据库全局内存在数据库被激活或者第一个用户程序连接到数据库时被分配。

(1)数据库管理器内存

数据库管理器内存用作对整个数据库系统的管理,可以进一步细分为:监视器堆、审计缓冲区两部分。监视器堆存放系统运行过程中的各种统计信息,用户可以从这些统计信息中找出系统存在的性能问题。审计缓冲区是可选的,如果系统打开了审计功能,就需要审计缓冲区来存放相关的处理信息。

下列配置参数和数据库管理器内存有关:

INSTANCE_MEMORY:设定系统启动时为数据库管理器分配的内存空间。

MON_HEAP_SZ:设定系统监视器堆可以使用的内存空间。如果用户需要获取系统更详细的运行信息而设置了跟踪、监控参数,就需要为监视器堆分配更多内存空间。

AUDIT_BUF_SZ:设定审计缓冲区的内存大小。

(2)进程专用内存

进程专用内存是监听、代理、异步预取、页清除、检查点、日志写等进程所使用的内存空间,为进程排它使用,就是第3.2.1一节中讲到的进程缓冲区。

除了进程专用内存,和进程有关的内存空间还包括:应用程序共享内存、代理/应用程序通信内存。如果DB2系统中包含多个分区,或者启用分区内并行功能,或者启用了连接集中器功能,系统就需要应用程序共享内存这一内存空间。如果在数据库服务器上运行客户端软件,这些软件使用共享内存和代理进程进行通讯,系统就需要代理/应用程序通信内存这一内存空间。由于这两部分内存空间是可选的,因此没有在图1-3中显示。

由于用户请求由代理进程完成,它的内存空间使用影响着用户请求的处理。因此在DB2系统中,用户可以使用配置参数,控制代理进程的内存空间使用。对于监听、异步预取、页清除、检查点、日志写等其它进程,它们的内存空间使用由系统自动进行管理。下列配置参数和代理进程的内存空间使用有关:

SORTHEAP:设定代理进程可以使用的排序堆内存大小。该参数设定用于排序的内存页的最大数目。如果排序为专用排序,此参数将影响代理进程专用内存;如果排序为共享排序,此参数将影响数据库共享内存。每个排序都有一个独立的排序堆,排序堆在需要时由系统分配,排序完成后释放。

APPLHEAPSZ:设定应用程序堆的内存大小。此参数设定代理进程接收用户连接、处理用户请求时,可以使用的最大内存空间。

STAT_HEAP_SZ:设定统计信息堆的内存大小。此参数指定代理进程在收集数据库对象的统计信息时,可以使用的最大内存空间。

QUERY_HEAP_SZ:设定查询堆的内存大小。在代理进程专用内存中,查询堆用来存放每个查询的语句文本、描述等信息,此参数指定为查询堆分配的最大内存数量。

AGENT_STACK_SZ:设定代理进程堆栈的内存大小。

(3)数据库全局内存

数据库全局内存可以划分为:数据库堆、实用程序堆、锁定列表、程序包高速缓存、缓冲池。下列配置参数可以对整个数据库全局内存进行设置:

DATABASE_MEMORY:设定为数据库分配的最小共享内存空间。

① 数据库堆

数据库堆用来存放数据库的数据字典和事务日志信息,还可以用作临时的内存空间。它包括目录高速缓存、日志缓冲区两部分,这两部分分别就是第3.2.2和第3.2.5两节中讲到的数据字典缓冲区和日志缓冲区。下列配置参数和数据库堆有关:

DBHEAP:设定数据库堆的内存大小。

CATALOGCACHE_SZ:设定目录高速缓存的内存大小。

LOGBUFSZ:设定日志缓冲区的内存大小。如果要调整该参数,必须考虑DBHEAP参数的调整。

② 实用程序堆

实用程序堆内存空间,在系统备份、恢复、数据装入时使用。下列配置参数和实用程序堆有关:

UTIL_HEAP_SZ:设定实用程序堆的内存大小。

③ 锁定列表

锁定列表用来存放数据库系统中的所有锁信息,就是第3.2.6一节中讲到的锁表缓冲区。下列配置参数和锁定列表有关:

LOCKLIST:设定锁定列表的最大内存大小。

④ 程序包高速缓存

程序包高速缓存用来存放优化器生成的SQL语句执行计划等,就是第3.2.4一节中讲到的SQL语句缓冲区。下列配置参数和程序包高速缓存有关:

PCKCACHESZ:设定程序包高速缓存的内存大小。

⑤ 缓冲池

缓冲池用来存放从数据文件中读取的用户数据,就是第3.2.3一节中讲到的用户数据缓冲区。在创建一个数据库时,系统会建立一个被称作IBMDEFAULTBP的缺省缓冲池,该缓冲池使用4KB的页尺寸,其空间大小由操作系统平台所决定。用户可以根据需要,使用命令修改缺省缓冲池的空间尺寸,或者创建新的缓冲池。没有和缓冲池相关的数据库配置参数。

2. 用户数据缓冲区的管理

DB2数据库的缓冲池,就是第3.2.3一节中讲到的用户数据缓冲区。每一个数据库都有一个页尺寸为4KB、被称作IBMDEFAULTBP的缺省缓冲池,可以更改该缓冲池的空间大小,但不能删除它。

DB2系统采用多缓冲池技术,用户可以根据需要创建其它的缓冲池,不同的缓冲池可以有不同的页尺寸。在创建数据库的表空间时,可以指定该表空间使用的页尺寸。如果没有指定,则页尺寸缺省为4KB。如果指定了不同于4KB的页尺寸,就应当为该表空间指定一个相同页尺寸的缓冲池,从而对该表空间中数据的缓冲和处理,就在这个缓冲池的内存空间中完成。该缓冲池必须在系统中存在。

为了防止系统中不存在相应的缓冲池,或者虽然创建但不能激活(由于没有足够的内存空间等),导致表空间不能被访问,DB2系统隐含创建了一些小的缓冲池,页尺寸分别为:4KB、8KB、16KB、32KB,每一个缓冲池只有16个内存页。当数据库的内存空间中没有和表空间页尺寸相对应的缓冲池时,系统就自动使用这些隐含的缓冲池。对这些隐含的缓冲池,用户不能看到、也不能直接使用。

DB2系统也使用LRU策略管理缓冲池中的内存页,但公开资料中并没有这方面的内容介绍,这里就不再多讲。

3.5.2 ORACLE数据库系统

1. 系统内存的空间结构

ORACLE系统的内存结构分为两个部分:系统全局区、程序全局区。系统全局区可以进一步划分为:共享池(shared pool)、缓冲区高速缓存(buffer cache)、重做日志缓冲区(redo log buffer)、大池(large pool)和JAVA池(JAVA pool),其中大池和JAVA池是可选的。具体的内存结构可见图1-4。

(1)程序全局区

程序全局区就是进程私有内存空间,是系统中代理、页清除、检查点、日志写等进程使用的一块包含数据和控制信息的内存区域,在进程启动或创建时分配,并为进程排他访问。它就是第3.2.1一节中讲到的进程缓冲区。在共享的服务器进程环境中,用户会话等相关信息存放在系统全局区的共享池或者大池中。

下列配置参数和程序全局区有关:

WORKAREA_SIZE_POLIY:设定是否启动程序全局区的内存自动管理功能。缺省为自动管理。

PGA_AGGREAGATE_TARGET:设定自动管理方式下,程序全局区使用的内存空间。

(2)系统全局区

系统全局区就是实例共享内存空间,存放数据字典、锁、要操作的用户数据等。内存空间以GRANULE为单位,可以动态地分配和回收(GRANULE是连续的内存分配单元,它的大小由SGA_MAX_SIZE配置参数来决定的。如果SGA_MAX_SIZE < 128MB,则等于4MB;否则等于16MB)。如果用户设定的值不是GRANULE的倍数,系统就自动调整到最接近的数值。

可以使用下列配置参数对整个系统全局区进行设置:

SGA_MAX_SIZE:设定系统全局区使用的最大内存空间。

(3)系统全局区的共享池

系统全局区的共享池可以进一步划分为:库高速缓存(library cache)和数据字典高速缓存(data directory cache)。下列配置参数和共享池有关:

SHARED_POOL_SIZE:设定共享池的内存空间大小。

① 库高速缓存

库高速缓存用来存放共享的SQL、PL/SQL代码以及执行计划等,供多个用户使用,减少SQL语句的再次编译,就是第3.2.4一节中讲到的SQL语句缓冲区,用户不能单独设置此部分的内存空间。

② 数据字典高速缓存

数据字典高速缓存用来存放数据字典信息,就是第3.2.2一节中讲到的数据字典缓冲区,用户不能单独设置此部分的内存空间。

(3)系统全局区的缓冲区高速缓存

系统全局区的缓冲区高速缓存用来存放从数据文件中读取的用户数据,就是第3.2.3一节中讲到的用户数据缓冲区。缓冲区高速缓存采用了多缓冲区技术,可以划为三个部分:DEFAULT、KEEP、RECYCLE,每一个部分有不同的使用方式。

下列配置参数和缓冲区高速缓存有关:

DB_CACHE_SIZE:设定DEFAULT缓冲区的大小。缺省情况下的数据访问和操作,使用此缓冲区。

DB_KEEP_CACHE_SIZE:设定KEEP缓冲区的大小。该缓冲区存放需要常驻内存的用户数据,可以根据常驻内存的用户数据数量,设置此配置参数。

DB_RECYCLE_CACHE_SIZE:设定RECYCLE缓冲区的大小。对很少或者偶尔被使用的用户数据,可以放置在这个缓冲区中。系统不会对该缓冲区中的数据使用LRU策略进行管理,数据被使用后,很快从内存中移走。

(4)系统全局区的重做日志缓冲区

系统全局区的重做日志缓冲区用来存放数据库日志信息,记录所有对数据库数据的修改,就是第3.2.5一节中讲到的日志缓冲区。下列配置参数和重做日志缓冲区有关:

LOG_BUFFER:设定重做日志缓冲区的内存空间。

(5)系统全局区的大池

大池是系统全局区的一个可选部件,只在共享的服务器进程环境中设定,用来存放会话、备份和恢复操作等信息。如果在共享的服务器进程环境中没有设定大池的话,这些信息也都存放在共享池中。下列配置参数和大池有关:

LARGE_POOL_SIZE:设定大池的内存空间。

(6)系统全局区的JAVA池

系统全局区的JAVA池为JAVA命令提供服务,存放JVM等JAVA部件,仅在安装和使用了JAVA时需要。下列配置参数和JAVA池有关:

JAVA_POOL_SIZE:设定JAVA池的内存空间。

2. 用户数据缓冲区的管理

系统全局区的的缓冲区高速缓存就是第3.2.3一节中讲到的用户数据缓冲区,它采用多缓冲区技术,划分为:DEFAULT、KEEP、RECYCLE三个缓冲区。

存放在KEEP缓冲区中的用户数据,数据库系统启动时自动装入并驻留内存。对于经常需要访问的数据,将它们绑定到KEEP缓冲池上,可以加快数据的访问速度,避免和其它数据的内存竞争,从而提高系统性能。

存放在RECYCLE缓冲区中的用户数据,在处理完成后很快就被调出内存。对于偶尔或者很少被访问的数据,可以将它们绑定到RECYCLE缓冲区,以避免对其它数据的影响。

DEFAULT缓冲区存放未指定缓冲区的用户数据,数据库系统中大部分的用户数据处理都要在这个缓冲区中完成。只有DEFAULT缓冲区使用了LRU算法,因此在ORACLE系统中,对用户数据缓冲区的管理就是对DEFAULT缓冲区的管理。

对DEFAULT缓冲区的管理,ORACLE系统使用了两个链:LRU LIST和DIRTY LIST。

LRU LIST链指向DEFAULT缓冲区中的数据块,按照数据块被访问的时间顺序排序。越靠近LRU LIST链的顶端,所对应的数据块越是在最近的时间被访问;越靠近LRU LIST链的底端,所对应的数据块越是有较长的时间没有被访问。

当服务器进程处理数据时,首先在整个数据高速缓存中查找所要处理的数据,有以下两种结果:

(1)找到所需数据。不管该数据存放在数据高速缓存的什么位置,系统把该内存页联接到LRU LIST链的顶端,整个数据高速缓存的LRU LIST链就相应地由上向下进行移动。

(2)没有找到所需数据。系统从LRU LIST链的底端找到可用的内存空间,将读入的数据块存入对应的内存缓冲区中,再将指向这些内存数据块的指针放置在LRU LIST链的顶端,然后开始数据的处理。

DIRTY LIST链记录内存缓冲区中已经发生了更新的数据块。如果已经被更新数据块达到了系统设定的极限值,或者服务器进程无法从LRU LIST链的底端获取足够的内存空间时,系统就指示数据库书写器进程,根据DIRTY LIST链,将这些已经被改变的数据块写回到磁盘中。

3.5.3 INFORMIX数据库系统

1. 系统内存的空间结构

INFORMIX系统的内存空间可以分为两大部分:虚拟处理器专用内存(VP专用内存)和共享内存。共享内存空间可以进一步划分为以下四个部分:常驻部分(resident portion)、虚拟部分(virtual portion)、IPC通讯部分(IPC communication portion)、虚拟扩展部分(virtual-extension portion)。具体的内存结构可见图1-5。

(1)虚拟处理器专用内存

就是进程的私有内存空间,是进程使用的一块包含数据和控制信息的内存区域,在进程启动或创建时分配,并为进程排他访问。由于INFORMIX系统采用多进程、多线程体系结构,有关线程的结构和会话信息存放在共享内存的虚拟部分,这两部分合起来就是第3.2.1一节中讲到的进程缓冲区。

用户不能直接设置虚拟处理器专用内存的大小,数据库系统通过启动的虚拟处理器个数、用户的连接数等,来决定这部分的内存空间。下列配置参数和虚拟处理器专用内存有关:

VPCLASS:设定系统要启动虚拟处理器的个数。

NETTYPE:设定系统启动的监听线程的数目、最大用户连接数。

STACKSIZE:设定用户线程的堆栈可以使用的内存空间。

(2)共享内存

就是系统的共享内存,存放数据字典、锁、要操作的用户数据等。可使用下列配置参数对整个共享内存进行设置:

SHMTOTAL:设定共享内存允许使用的最大内存空间。

SHMBASE:设定共享内存空间的起始地址。该参数的设置和操作系统有关,不要修改。

SERVERNUM:设定数据库实例的编号。该参数使同一台机器中的多个实例使用的内存空间不会重叠。

(3)共享内存的常驻部分

共享内存的常驻部分可以进一步划分为:缓冲池(buffer pool)、逻辑日志缓冲区(logical-log buffer)、物理日志缓冲区(physical-log buffer)、锁表(lock table)。

① 缓冲池

缓冲池用来存放用户要处理的数据,就是第3.2.3一节中讲到的用户数据缓冲区。下列配置参数和缓冲池有关:

BUFFERS:设定缓冲池的内存空间。

LRUS:设定系统启动时创建的LRU队列(LRU queue)的数目。配置参数BUFFERS除以该参数,就得出每个LRU 队列要管理的缓冲区的数目。

② 逻辑日志缓冲区

逻辑日志缓冲区用来记录对数据库更新的日志信息,就是第3.2.5一节中讲到的日志缓冲区。下列配置参数和逻辑日志缓冲区有关:

LOGBUFF:设定逻辑日志缓冲区的内存空间。系统根据该参数分配两个逻辑日志缓冲区,循环使用。在当前所有事务往一个缓冲区中写入日志信息时,日志写进程可以将另一个缓冲区中的日志信息写入磁盘。

③ 物理日志缓冲区

物理日志缓冲区用来存放数据页被更新之前的内容,下列配置参数和物理日志缓冲区有关:

PHYSBUFF:设定物理日志缓冲区的内存空间。系统根据该参数分配两个物理日志缓冲区,循环使用。其使用方式和逻辑日志缓冲区类似。

④ 锁表

锁表用来存放数据库系统中的所有锁信息,就是第3.2.6一节中讲到的锁表缓冲区。下列配置参数和锁表有关:

LOCKS:设定数据库系统初始的锁数目。在需要的锁数目超过该参数时,系统自动加倍可使用的锁数目,最多可以加倍15次。

(3)共享内存的虚拟部分

共享内存的虚拟部分可以动态地扩展,下列配置参数和共享内存的虚拟部分有关:

SHMVIRTSIZE:设定虚拟部分起始的内存空间大小。

SHMADD:设定往虚拟部分增加的内存空间数量。在共享内存虚拟部分的空间不足时,系统根据该参数增加内存空间。

共享内存的虚拟部分可以进一步细分为多个内存结构,每一部分都有自己的内存池。数据库系统需要某一部分的内存空间时,首先从相应部分的内存池中查找。如果没有空间,就从共享内存虚拟部分的全局池中分配。如果全局池中也没有足够的空间,数据库系统就从操作系统获取内存增加到共享内存的虚拟部分。共享内存的虚拟部分可以细分为以下部分:字典高速缓存(dictionary cache)、线程结构和堆栈以及会话信息(thread structure、stack、session data)、SQL语句高速缓存(sql statement cache)。

① 字典高速缓存

字典高速缓存就是第3.2.2一节中讲到的数据字典缓冲区,用户不能单独设置此部分的内存空间。

② 线程结构、堆栈和会话信息

该部分加上虚拟处理器专用内存,就是第3.2.1一节中讲到的进程缓冲区,用户不能单独设置此部分的内存空间。

③ SQL语句高速缓存

SQL语句高速缓存用来存放优化器生成的SQL语句执行计划等,就是第3.2.4一节中讲到的SQL语句缓冲区。下列配置参数和SQL语句高速缓存有关:

STMT_CACHE:设定系统是否使用SQL语句高速缓存功能。

STMT_CACHE_SIZE:设定SQL语句高速缓存的内存空间。

STMT_CACHE_HITS:设定SQL语句被放入缓存前的访问次数。

STMT_CACHE_NOLIMIT:设定是否允许扩展SQL语句高速缓存的内存空间。

(4)共享内存的IPC通讯部分

如果数据库系统使用了共享内存通讯方式,则创建此部分内存空间,专门用于共享内存通讯。其空间大小由通讯连接数乘以12KB得到。

(5)共享内存的虚拟扩展部分

如果用户在数据库系统中创建了用户定义函数,并定义了用户定义虚拟处理器,或者安装、使用了datablade模块,则创建此部分内存空间。

2. 用户数据缓冲区的管理

在INFORMIX系统中,缓冲池就是第3.2.3一节中讲到的用户数据缓冲区。系统根据配置参数LRUS的设置,均匀地将缓冲区划分为多个部分,每一部分都使用一个LRU队列进行管理。

一个LRU队列由两张表组成:FLRU(free least-recently used)、MLRU(modified least-recently used)。 FLRU表记录LRU队列中没有被修改的数据页,MLRU表记录LRU队列中已经被修改的数据页。在内存中的数据页被更新后,就放入MLRU表。

当用户线程需要内存空间存放数据时,数据库系统随机地从所有的FLRU表中选择一个。如果找到空闲的数据页,系统就停止查找。如果找不到空闲的数据页,系统就选择其它的FLRU进行处理。

在所有的FRLU表中都找不到空闲的数据页后,数据库系统激活页清除进程,根据MLRU表,将缓冲区中已经被修改的脏数据页写入磁盘。

3.5.4 SYBASE数据库系统

1. 系统内存的整体管理

在SYBASE系统中,可以使用下列配置参数,对整个数据库系统的内存空间使用进行设置:

(1)MAX MEMORY(最大内存):设定整个数据库系统实例可以使用的最大内存数量,包括缓冲数据、程序代码的内存空间。

(2)TOTAL LOGICAL MEMORY(总逻辑内存):显示整个数据库系统所需内存空间的总和。该参数是一个只读的配置参数,用户无法更改。它是数据库系统根据所有和内存分配有关的配置参数的设置,进行计算而得出的系统所需内存空间的总和。这个配置参数的值必须小于或者等于最大内存,否则数据库系统无法启动。

(3)TOTAL PHYSICAL MEMORY(总物理内存):显示整个数据库系统在特定时刻使用的内存空间总和。该参数是一个只读的配置参数,用户无法更改。它显示数据库系统所有内存空间的总和,也即数据库系统实例在某个特定时刻所分配的内存空间总和。

(4)ALLOCATE MAX SHARED MEMORY:设定数据库系统启动时,是否立即为系统分配所要求的最大内存。如果该参数被设置,在数据库系统启动时,将按照最大内存配置参数的设置,为数据库系统分配内存空间。在这种情况下,总物理内存就等于最大内存,如果数据库系统需要的总逻辑内存小于最大内存,则为数据库系统分配的部分内存空间不会被使用。

(5)DYNAMIC ALLOCATION ON DEMAND:设定数据库系统启动时或者系统正常运行过程中改变了配置参数之后,是否立即按照配置参数,为系统的各个内存段分配所要求的空间。如果该参数被设置,将根据配置参数的设置,进行内存空间的分配,不管这些内存是否被用到。如果该参数没有被设置,将根据数据库系统的需要,为各个内存段分配空间。

在主机内存空间足够的情况下,为避免系统正常运行时动态的内存空间分配,导致内存空间不连续,影响到数据库系统的性能,可以设置配置参数ALLOCATE MAX SHARED MEMORY,从而在数据库系统启动时就为其分配连续的、可使用的最大内存空间。

需要说明的是,由于SYBASE系统在估计内存需求的方式和实际获取内存以供使用的方式上有一些差异,因此理论上在最大内存、总逻辑内存、总物理内存之间应当具有相等关系时,使用系统命令查看,这三个配置参数在数值上会有一些差别。

2. 系统内存的空间结构

整个SYBASE系统的内存结构大体上可以分为四个部分:数据高速缓存(data cache)、过程高速缓存(procedure cache)、内核和服务器结构(kernel and server structure)、可执行代码,具体的结构见图1-6。

(1)数据高速缓存

数据高速缓存用来存放用户数据、索引和事务日志,就是第3.2.3和第3.2.5两节中讲到的用户数据缓冲区和日志缓冲区。

在缺省情况下,日志缓冲区并没有被设置。代理线程生成的事务日志存放在自己的私有内存空间中,由代理线程写入磁盘。为提高数据库系统的性能,可以在数据高速缓存中配置日志缓冲区。这样代理线程将事务日志写入日志缓冲区,最后由日志写线程统一写入磁盘,可以减少磁盘的I/O操作。

下列配置参数和数据高速缓存有关:

TOTAL DATA CACHE SIZE:显示数据高速缓存的大小,是一个只读参数。用户可以使用命令sp_cacheconfig、sp_poolconfig,配置和管理数据高速缓存。

(2)过程高速缓存

过程高速缓存用来存放存储过程、触发器、SQL语句等已编译的执行计划,就是第3.2.4一节中讲到的SQL语句缓冲区。下列配置参数和过程高速缓存有关:

procedure cache size:设定过程高速缓存的空间大小。

(3)可执行代码内存区域

可执行代码内存区域用来存放数据库各种线程的执行代码,这部分加上后面的线程控制信息及堆栈缓冲,就是第3.2.1一节中讲到的进程缓冲区。

这部分内存空间的分配,由用户连接数(也即代理线程数)和工作线程决定,有以下相关配置参数:

NUMBER OF USER CONNECTIONS:设定数据库系统可以建立的用户连接数目。该参数也同时决定了数据库系统可以启动的代理线程的数目。

NUMBER OF WORKER PROCESSES:设定数据库系统可以启动的工作线程数目。

(4)内核和服务器结构内存区域

内核和服务器结构内存区域是SYBASE系统既关键又复杂的内存空间,除数据高速缓存、过程高速缓存、可执行代码内存区域所存放信息之外,所有其它系统信息都存放在这一内存空间。

SYBASE系统的技术资料中,没有对这部分内存的使用进行详细的描述。大体上来说,这部分内存空间包括以下的内容:

① 线程的控制信息及堆栈缓冲

线程的控制信息及堆栈缓冲用来存放线程的堆栈、控制信息等,这部分加上前面的可执行代码内存区域,就是第3.2.1一节中讲到的进程缓冲区。这部分内存空间的分配,由用户连接数(也即代理线程数)和工作线程决定,有以下相关配置参数:

NUMBER OF USER CONNECTIONS:设定数据库系统可以建立的用户连接数目。该参数也同时决定了数据库系统可以启动的代理线程的数目。

NUMBER OF WORKER PROCESSES:设定数据库系统可以启动的工作线程数目。

STACK SIZE:设定每个线程使用的堆栈空间。线程使用此区域存放线程环境及本地数据。

HEAP MEMORY PER USER:设定每个用户的堆内存量。需要更多堆栈中内存的任务,可以从这里获取所需内存。

USER LOG CACHE SIZE:设定每个线程的日志高速缓存空间。

② 数据字典(元数据)高速缓存

数据字典高速缓存用来存放数据库以及表、索引、视图等信息,就是第3.2.2一节中讲到的数据字典缓冲区。用户可以通过间接的方式,来配置该部分的内存空间。下列配置参数和数据字典高速缓存有关:

NUMBER OF OPEN DATABASES:设置能够同时打开的数据库的最大数量。

NUMBER OF OPEN INDEXES:设置能够同时使用的索引的最大数量。

NUMBER OF OPEN OBJECTS:设置能够同时打开的数据库对象的最大数量。

③ 锁表高速缓存

锁表高速缓存用来存放数据库系统中的所有锁信息,就是第3.2.6一节中讲到的锁表缓冲区。下列配置参数和锁表缓冲区有关:

NUMBER OF LOCKS:设定数据库系统中所有用户可用锁的总数。

3. 用户数据缓冲区的管理

在SYBASE系统中,数据高速缓存就是第3.2.3一节中讲到的用户数据缓冲区。SYBASE系统采用多缓冲区技术。在最初的安装、配置完成后,系统中只有一个缺省的数据高速缓存。随后用户可以根据自己的需要,创建多个数据高速缓存。可以将经常需要访问的数据库对象绑定到特定的数据高速缓存中,在做了这样的绑定操作之后,该数据高速缓存就只供被绑定的数据库对象使用,从而避免和其它数据库对象的内存竞争。没有明确进行绑定的数据库对象,就使用系统缺省的数据高速缓存。

用户可以使用以下两种方式,进一步深化对数据高速缓存的管理:

(1)分区。可以将数据高速缓存分区,相当于在系统中建立了多个数据高速缓存,每一个分区都具有相同的内存空间,并独立地进行管理和维护。

(2)划分缓冲池。一个数据高速缓存可以被划分为多个缓冲池,每一个缓冲池对应不同的I/O读写尺寸。例如:数据库的逻辑页为2K,可以在一个数据高速缓存中创建页尺寸分别为2K、4K、8K、16K的四个缓冲池。由于系统一次最大可以从硬盘中将一个扩充(extent,8个数据页)读入内存,如果使用16K缓冲池,则一次可以从硬盘中读取128K的数据。

在SYBASE系统中,使用MRU/LRU链接表管理数据高速缓存中内存页的替换。正在被访问的内存页被放入MRU的最前端,越靠近LRU端的内存页,就表明有更长的时间没有被访问。

在MRU/LRU链接表的中间有一个清洗标记,清洗标记和LRU端之间的内存页称为清洗区。在清洗区中已经被更新的内存页,就要由页清除线程写入磁盘。MRU/LRU链接表的结构见图3-2。在该图中,整个数据高速缓存包含了21个内存页,数字表示内存页的指针。

代理线程在处理用户请求时,首先在整个数据高速缓存中查找所要处理的数据,有以下两种结果:

(1)找到所需数据。不管该数据存放在数据高速缓存的什么位置,系统把该内存页的指针联接到MRU的最前端,整个数据高速缓存链就相应地由左向右进行移动。如果有内存页进入清洗区,并且内存页中的数据已经发生了更新,页清除线程开始把此内存页写入磁盘。

(2)没有找到所需数据。代理线程从磁盘中读入数据。如果需要一个内存页的空间,系统就取出LRU端的最后一个内存页指针,找到指针所指向内存页的位置,存入刚读入的数据,然后把这个内存页的指针联接到MRU的最前端。在需要多个内存页时的处理方式,与此类似。同样,进入清洗区的内存页如果已经被更新,页清除线程开始把此内存页写入磁盘。

以上是数据高速缓存缺省的管理模式,其中包含了数据高速缓存的两种管理策略:内存替换策略和MRU数据存放策略。用户可以根据需要,改变这种管理方式。

(1)内存替换策略。数据高速缓存的内存替换策略有两种:严格LRU(strict LRU)和宽松LRU(relaxed LRU),可以通过sp_cacheconfig命令来设置。

严格LRU是缺省模式。在此模式下,数据库系统严格地维护内存页的MRU/LRU链接表,根据这个链接表分配内存空间。在维护链接表时,由于内存页的移动而需要改变内存页的指针,从而需要对这个链接表加螺旋锁。如果系统中有多个引擎时,尽管链接表被锁定的时间很短,仍旧会引起对链接表的竞争。由于每个数据高速缓存、数据高速缓存中的每个分区、数据高速缓存中的每个内存池都需要建立一个链接表,因此可以通过建立多个数据高速缓存、将数据高速缓存分区、在数据高速缓存中建立多个内存池,来减少对链接表的竞争。

在宽松LRU模式下,系统并不会严格地维护这个链接表,尽可能地减少对MRU/LRU链接表的锁定竞争。在数据高速缓存中的空间能够满足该数据高速缓存所绑定的对象,或者该数据高速缓存主要用做日志的缓冲时,可以设置数据高速缓存为此模式,从而减少由于维护链接表而需要消耗的开销。

(2)MRU数据存放策略。通过表扫描、索引扫描访问数据时,系统会使用预读取功能,将随后要处理的数据事先读入内存。对这些预先读取的数据,可以使用、也可以不使用MRU数据存放策略。

如果使用MRU数据存放策略,被预先读入内存的数据首先链接在MRU/LRU链接表的MRU一端,被使用时就移动到清洗区。这种数据使用方式,一方面可以让这些大批量、一次性的数据尽快移出内存,避免影响其它数据的LRU替换管理;另一方面也可以防止预先读入内存的数据,还没有使用就被移出内存。

如果不使用MRU数据存放策略,被预读取数据在MRU/LRU链接表中就按照正常的数据访问方式进行管理。

用户可以在SQL查询语句中指定该语句的MRU数据存放策略,也可以使用sp_cachestrategy命令,改变某一个数据库对象的MRU数据存放策略。确省情况下,数据库对象的MRU数据存放策略被设置。

3.6 本章小结

数据库系统有自己的内存管理和调度。整个内存空间依据存放数据和功能的不同,被划分为多个部分,主要包括:进程缓冲区、数据字典缓冲区、用户数据缓冲区、SQL语句缓冲区、日志缓冲区、锁表缓冲区。每个部分分别使用单独的页表进行请求调页管理、请求淘汰换页管理。一个数据库系统可以使用多个页尺寸读取磁盘中的数据。

进程缓冲区是进程的私有内存空间,存放进程控制块、堆栈、数据、程序代码等进程运行所需要的相关信息,被进程排它性地使用。它在进程启动时被分配,在进程中止后被回收。用户一般不用改变进程缓冲区的配置。

数据字典缓冲区存放数据库的数据字典信息,在数据库系统启动时分配。应当避免在系统正常运行过程中,由于内存空间不足,而引起对数据字典信息的读出和读入。

用户数据缓冲区存放数据库中的用户数据。这些用户数据由代理进程读入内存,由页清除进程将更新后的数据写入磁盘。它的配置和管理,对数据库系统性能有着重要的影响,应当保证它的数据命中率在95%以上。

SQL语句缓冲区存放由优化器生成的SQL语句执行计划,不要在数据库系统正常运行时对系统进行维护,以避免SQL语句的再次编译。

日志缓冲区存放事务执行过程中产生的日志信息,由日志写进程将日志缓冲区中的数据写入磁盘。

锁表缓冲区存放为数据库对象所加的锁。为保证数据的更新操作不会丢失,在处理数据前,数据库系统要对数据加相关的锁。在更新完成后,这些锁就被释放。

常见的数据库系统:DB2、ORACLE、INFORMIX、SYBASE,其内存空间结构的使用和管理不尽相同。要正确配置和管理各个数据库系统的内存使用,需要了解和掌握其内存空间的结构和作用。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织