【数据库系统】第三部分 数据库系统(12) 数据库管理系统

本文详细介绍了数据库管理系统(DBMS)的结构与功能,包括数据定义、组织、操纵、运行管理、语言处理、数据存取等层面。重点阐述了DBMS的层次结构,如语言处理层的语法分析、查询优化,数据存取层的记录存取、事务管理、封锁系统等,并探讨了预编译和解释方法。同时,强调了数据库的物理组织,如数据字典、存取路径的组织和管理。内容适用于数据库管理员和应用开发人员理解与使用DBMS。

本文属于「数据库系统学习实践」系列文章之一,这一系列着重于「数据库系统知识的学习与实践」。由于文章内容随时可能发生更新变动,欢迎关注和收藏数据库系统系列文章汇总目录一文以作备忘。需要特别说明的是,为了透彻理解和全面掌握数据库系统,本系列文章中参考了诸多博客、教程、文档、书籍等资料,限于时间精力有限,这里无法一一列出。部分重要资料的不完全参考目录如下所示,在后续学习整理中还会逐渐补充:

  • 数据库系统概念 第六版 Database System Concepts, Sixth Edition ,作者是 Abraham Silberschatz, Henry F. Korth, S. Sudarshan ,机械工业出版社
  • 数据库系统概论 第五版,王珊 萨师煊编著,高等教育出版社


本文将进一步介绍数据库管理系统的基本功能,重点关注系统结构实现技术,不过不是针对数据库管理系统的设计者,而是面向数据库管理员、以及数据库应用系统开发人员,使其从宏观和总体的角度,掌握数据库管理系统的基本概念和基本原理,以便更好地使用和维护数据库管理系统。关于数据库管理系统具体的实现技术、实现算法和数据结构,这些内容可以参考专门的设计教材。

本章文献


12.1 数据库管理系统的基本功能

数据库管理系统,已经发展成为继操作系统之后最复杂的系统软件。第一章已讲过,数据库管理系统主要是实现对共享数据有效的组织、存储、管理和存取。围绕数据,数据库管理系统应具有如下基本功能(对第1章的详细说明和前面的总结)。

  1. 数据定义功能和数据库创建(第3、4、5章)
    数据库管理系统提供数据定义语言 Data Definition Language, DDL ,用户通过它,可以方便地对数据库中的「数据对象的组成与结构」进行定义。创建数据库,主要是用DDL定义和创建数据库模式、外模式、内模式等数据库对象;在关系数据库中,就是建立数据库(或模式)、表、视图、索引等,以及创建用户、数据库的安全性定义(如用户口令、级别、角色、存取权限)、数据库的完整性定义。这些定义存储在数据字典(或称系统目录)中,是数据库管理系统运行的基本依据

  2. 数据组织、存储和管理(第9、12章)
    数据库管理系统要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存取路径等。要确定以何种「文件结构和存取方式」在存储器上组织这些数据,以及如何实现数据之间的联系。数据组织和存储的基本目标是提高存储空间利用率、方便存取,为此还提供了多种存取方法(如索引查找、hash 查找、顺序查找等)以提高存取效率。

  3. 数据操纵功能(第3、8章)
    数据库管理系统还提供数据操纵语言 Data Manipulation Language, DML ,用户可以用它操纵数据库的数据,实现对数据库的基本操作,如查询、插入、删除和修改等。一个好的关系DBMS,应提供功能强大且易学易用的DML、方便的操作方式和较高的数据存取效率。DML有两类:宿主型语言和自主(独立)型语言。

  4. 数据库的运行管理(第4、5章)和事务管理(第10、11章)
    数据库在建立、运用和维护时,由数据库管理系统运行控制和统一管理,提供的功能包括:多用户环境下的事务管理功能;存取控制,安全性和完整性检查、执行和控制功能;数据库恢复、并发控制和死锁检测(或死锁防止)、运行日志的组织管理等。这些功能保证了数据库系统的正确运行,保证数据的安全性、完整性,保证了事务的ACID特性。

  5. 数据库的建立和维护(第7、10章)
    此项功能包括数据库的初始建立、数据的输入和转换,以及数据库的转储和恢复、数据库的重组织与重构造、性能监视和检测分析等。这些功能,通常是由一些实用程序或管理工具完成的。

  6. 其他功能
    此外,数据库管理系统还包括与网络中其他软件系统的通信功能与另一个数据库管理系统或文件系统的数据转换功能异构数据库之间的互访和互操作功能等。
    随着技术的发展,许多新的应用对数据库管理系统提出了新的需求,数据库管理系统要不断发展新的数据管理技术,例如XML数据、流数据、空间数据、多媒体数据等管理技术。

和操作系统、编译构建系统等系统软件相比,数据库管理系统具有跨度大、功能多的特点——从最底层的存储管理、缓冲区管理、数据存取操作、语言处理到最外层的用户接口、数据表示、开发环境的支持等,都是它要实现的功能。数据库管理系统的实现,既要充分利用计算机硬件、操作系统、构建系统和网络通信等技术,又要突出对海量数据存储、管理和处理的特点,还要保证其存取数据和运行事务的高效率,所以是一个复杂而综合的软件设计开发过程。

下面几节,将着重讨论数据库管理系统的基本结构、语言处理等实现方法和技术。


12.2 数据库管理系统的系统结构

12.2.1 数据库管理系统的层次结构

和操作系统相似,数据库管理系统可划分成若干层次。清晰合理的层次结构,不仅可以使用户更清楚地认识数据库管理系统,更重要的是,有助于数据库管理系统的设计和维护

例如,IBM公司最早研制的、著名的关系DBMS实验系统 SystemR ,其核心分为两层:底层的关系存储系统 RSS 和上层的关系数据系统 RDS —— RDS 本质上是一个语言和执行层,包括语法检查与分析、优化、代码生成、视图实现、完整性安全性检查等功能;RSS 则是一个存取方法层,其功能包括空间和设备管理、索引和存取路径管理、事务管理、并发控制、运行日志管理和恢复等。

下图给出一个关系DBMS的层次结构示例,这一结构是按照「处理对象的不同」,从最高级到最低级的次序来划分的,具有普遍性。图中还包括了与关系DBMS密切相关的应用层和操作系统:

  • 最上层的是应用层,位于关系DBMS的核心之外。应用层处理的对象是各种各样的数据库应用,如用开发工具开发的或用嵌入式SQL、存储过程等编写的应用程序,以及终端用户通过应用接口、发出的事务请求或各种查询要求等。该层是关系DBMS与用户/应用程序的界面层
  • 第二层是语言处理层。该层处理的对象是数据库语言,如SQL。它向上提供的数据接口是关系、视图,即元组的集合。该层的功能是,对数据库语言的各类语句进行语法分析、视图转换、安全性检查、完整性检查、查询优化等,再通过对下层基本模块的调用,生成可执行代码,运行这些代码即可完成数据库语句的功能要求。
  • 第三层是数据存取层。该层处理的对象是单个元组把上层的集合操作转换为单记录操作。该层执行扫描(如表扫描)、排序、元组的查找/插入/修改/删除、封锁等基本操作,该层还完成数据记录的存取、存取路径维护、事务管理、并发控制和恢复等工作。
  • 第四层是数据存储层。该层处理的对象是数据页系统缓冲区,执行文件的逻辑打开与关闭、读页、写页、缓冲区读和写、页面淘汰等操作,完成缓冲区管理、内外存交换、外存的数据管理等功能。
  • 操作系统是数据库管理系统的基础, 它处理的对象是数据文件的物理块,执行物理文件的读写操作,保证数据库管理系统对数据逻辑上的读写、真实地映射到物理文件上。操作系统提供的存取原语和基本的存取方法,通常作为接口提供给数据库管理系统的数据存储层。

当然,具体系统在划分细节上会是多种多样的,可以根据关系DBMS实现的环境以及系统的规模,进行灵活处理。下面按照由外而内的次序,依次介绍图12.1中的各个层次。

12.2.2 关系数据库管理系统的运行过程示例

关系DBMS是一个复杂而有序的整体,应该用动态的观点,看待关系DBMS的各个功能模块。下图12.2考察一个应用程序/用户,通过关系DBMS读取数据库中数据的全过程,以加深对关系DBMS的了解。图中的数据字典是数据库的重要组成部分,存储元数据如数据库定义等。

(1)用户 A A A 通过应用程序 A A A ,向关系DBMS发出调用数据库数据的命令,如 select 命令,命令中给出了一个关系名和查找条件。
(2)关系DBMS首先对命令进行语法检查,检查通过后进行语义检查和用户权限检查。具体做法是,关系DBMS读取数据字典,检查是否存在该关系及相应的字段、该用户能否读取它们等,确认语义正确、存储权限合法后,就决定执行该命令;否则拒绝执行,返回错误信息。
(3)关系DBMS执行查询优化。优化器要依据数据字典中的信息进行优化,并把该命令转换成一串单记录的存取操作序列。
(4)关系DBMS执行存取操作序列(反复执行以下各步,直到结束)。
(5)关系DBMS首先在系统缓冲区中查找记录,若找到满足条件的记录则转到(10),否则转到(6)。
(6)关系DBMS查看存储模式,决定从哪个文件、用什么方式读取哪个物理记录。
(7)关系DBMS根据(6)的结果,向操作系统发出读取记录的命令。
(8)操作系统执行读数据的有关操作。
(9)操作系统将数据从数据库的存储区,送到系统缓冲区。
(10)关系DBMS根据查询命令和数据字典的内容,导出用户所要读取的记录格式。
(11)关系DBMS将数据记录,从系统缓冲区传送到应用程序 A A A 的用户工作区。
(12)关系DBMS将执行状态信息,如成功读取或不成功的错误指示、例外状态信息等返回给应用程序 A A A

对照12.2.1节中给出的关系DBMS层次结构,可大致作如下的对应:

  • 动作(1)属于第一层——应用层;
  • 动作(2)、(3)由第二层——语言处理层完成;
  • 动作(4)、(10)、(11)、(12)由第三层——数据存取层来完成;
  • 动作(5)、(6)、(7)由第四层——数据存储层来进行;
  • 动作(8)、(9)由操作系统执行。

整个关系DBMS的各层模块互相配合、互相依赖,共同完成对数据库的操纵。对其他一些操作,如插入、删除、修改,其过程与读一个记录是类似的。


12.3 语言处理层

前面学过,关系DBMS一般向用户提供多种形式的语言,如交互式命令语言(如SQL)、嵌入主语言的嵌入式语言(如ESQL)、过程化语言(如过程化SQL和存储过程、自定义函数)等。这些语言,都是由关系DBMS的语言处理层来支持的。

12.3.1 语言处理层的任务和工作步骤

语言处理层的任务就是,把用户在各种方式下提交给关系DBMS的数据库语句,转换成对关系DBMS内层的、可执行的基本存取模块的调用序列

数据库语言通常包括数据定义语言、数据操纵语言、数据控制语言三部分。数据定义语句的处理相对独立和简单,数据操纵和数据控制语句则较为复杂。

具体来说,对数据定义语句,语言处理层完成语法分析后,首先把它翻译成内部表示,然后把它存储在系统的数据字典中。对数据控制语句的定义部分,如安全保密定义、存取权限定义、完整性约束定义等的处理,与数据定义语句相同。

数据字典是数据操纵语句的处理、执行以及关系DBMS运行管理的基本依据。在关系DBMS中,数据字典通常采用和普通数据同样的表示方式(见12.6 数据库的物理组织),即也用关系表 table 来表示。数据字典包括关系定义表、属性表、视图表、视图属性表、视图表达式表、用户表、用户存取权限表等。图12.3给出了一个关系DBMS中数据字典的一部分示意图:

对于数据操纵语句,语言处理层要做的工作比较多,图12.4给出了关系DBMS中数据操纵语句处理过程的示意图:

数据操纵语句的处理过程如下:
(1)对数据操纵语句进行词法分析语法分析,并把外部关系名、属性名转换为内部名。外部名便于用户记忆和使用,内部名则整齐划一。在符号名转换过程中需存取数据字典。词法和语法分析通过后,就生成语法分析树;
(2)根据数据字典中的内容,进行查询检查,包括审核用户的存取权限完整性检查

  • 对那些具有存取谓词的存取权限,它们可能与数据的具体取值有关,则此时不能确定该语句能否执行,于是还要生成相应的动作,以便运行时检查。
  • 完整性检查是查询检查的重要内容。关系DBMS参照数据字典中的完整性约束规则,这时只是进行部分静态约束检查,如检查数据的类型、范围是否符合数据定义。很多完整性约束条件是在执行时检查的,如实体完整性约束是在执行数据插入时检查的,即检查插入的元组其主键是否已经存在、以保证主键的唯一性。同样,这时也要检查参照完整性约束(如果有的话)。此外,对某些动态完整性规则,它们与数据值和执行过程有关,则也要在操作执行时进行检查。
  • 查询检查还包括视图消解(或称视图转换),即数据操纵语句涉及对视图的操纵,则首先要从数据字典中,取出视图的定义,根据该定义把对视图的操作转换为对基本表的操作。

(3)查询优化。优化分为两类,一类为代数优化,另一类为物理优化(或存取路径优化)。后者要根据数据字典中记载的各种信息,按照一定的优化策略,选择一个系统认为是较好的存取方案,并把选中的方案描述处理。

综上所述,将数据库的数据操纵语句、转换成一串可执行的存取动作,这一过程称为一个逐步束缚 bind 的过程。它将数据操纵语言的高级的描述型语句(集合操作),转换为系统内部低级的单元组操作,将具体的数据结构、存取路径、存储结构等结合起来,构成了一串确定的存取动作。

在各种具体的关系DBMS中,这一束缚过程基本一致,但进行这一过程的时间则有所不同,有的在运行中进行,有的在运行前进行。于是形成了两种基本的翻译方法:解释方法和预编译方法

12.3.2 解释方法

解释方法的具体做法是指,直到执行前,数据操纵语句都以原始字符串的形式保存,当执行到该语句时,才利用解释程序去完成图12.4中所示的全部过程,同时予以执行。这种方法通过尽量推迟束缚过程,以赢得数据独立性

解释方法具有灵活、应变性强的优点,甚至能适应在解释过程中发生的、数据结构和存储结构等的变化,因此能保持较高的数据独立性。但由于每次执行一个数据操纵语句时,都要执行图12.4所示的所有步骤,尤其当这样的语句位于一个循环体内时,就要多次重复解释一个数据操纵语句,开销会很大,因此效率比较低。

随着数据库技术的发展,解释方法已逐步被预编译方式所取代,目前这种方法主要用于交互式SQL。

12.3.3 预编译方法

预编译方法的基本思想是,在用户提交数据操纵语句后,在运行之前对它进行翻译处理,保存产生好的可执行代码;当需要运行时,取出保存的可执行代码加以执行。下面以DB2为例,说明这种方法。下图描述了DB2处理「嵌入SQL语句的应用程序」的方法。

假定被处理的对象是一个C语言源程序:

  • 首先,它被一个预编译器处理,这个预编译器的功能是识别SQL语句,把它们替换成源语言的函数调用(原先的SQL语句将作为注解,放在修改后的源程序中,以备恢复和阅读用)。预编译器还取出SQL语句,将每个SQL语句生成一个数据库请求模块 Data Base Request Module, DBRM ,它是下一步束缚过程的输入。
  • 修改后的C源程序,按照通常方式被编译、链接 linking 处理,生成装载模块;
  • 束缚过程类似于图12.4执行的功能,它实际上是一个SQL语句的优化编译器,编译一个至多个数据库请求模块,生成应用规划。应用规划中包含了对基本存取模块的调用,完成数据库请求模块对应的源SQL语句的功能。这样,一个C源程序现在分成了两个部分:装载模块和应用规划
  • 在运行时,当装载模块执行过程中,遇到访问数据库的函数调用时,就把控制权交给运行监督器。运行监督器找到相应的应用规划后,将其调入内存,并转让控制权。然后由应用规划去启动数据存储管理器,执行实际的数据存取,并把结果返回给C程序。

使用这种方法会遇到这样的问题:在束缚过程中进行优化、所依据的条件可能在运行前已不存在,或者数据库结构已被修改,因而导致已作出的应用规划、在执行时不再有效。例如,在束缚过程中,决定使用某一索引来加快存取速度,而在该程序编译完成之后、运行之前,该索引被删除了,那么运行时就会出现不可预测的现象。

为了解决这类问题,采用了重编译方法,即当数据库中因某些成分的改变,而使一些程序(语句)的编译结果无效时,再对它们执行一次编译。重编译可在不同时刻进行。为了提高整个系统的效率,不应在数据库某一成分改变后,就立即对受影响的那些源程序重编译,较好的方法是将受影响的编译结果置无效标志,在其被执行时才进行自动重编译

自动重编译技术,使得预编译方法既拥有了编译时进行束缚所带来的高效率,又具备执行时束缚带来的数据独立性。实践证明,预编译方法的效率比其他方法高两倍以上。


12.4 数据存取层

数据存取层介于语言处理层和数据存储层之间,它向上提供单元组接口,即导航式的一次一个元组的存取操作;向下则以系统缓冲区的存储器接口作为实现基础。其接口关系如图12.6所示:

图12.6中给出了每个层次中操作对象的数据结构,例如,数据存取层所涉及的主要数据结构为逻辑数据记录、逻辑块、逻辑存取路径。其中,存取层的任务主要包括:
(1)提供「一次一个元组」的查找、插入、删除、修改等基本操作;
(2)提供元组查找所循的存取路径,以及对存取路径的维护操作,如对索引记录的查找、插入、删除、修改。若索引采用 B + B^+ B+ 树,则应提供 B + B^+ B+ 树的建立、查找、插入、删除、修改等功能
(3)对记录和存取路径的封锁、解锁操作;
(4)日志文件的登记和读取操作;
(5)其他辅助操作,如扫描、合并/排序,其操作对象有关系、有序表、索引等。

为了完成上述功能,通常把数据存取层又划分为若干功能子系统加以实现。

12.4.1 数据存取层的系统结构

数据存取层包括许多功能,在实际的关系DBMS中,由多个功能子系统来完成。图12.7是数据存取层的系统结构,它包括下列子系统和模块:

  • 记录存取、事务管理子系统;
  • 控制信息管理模块;
  • 排序/合并子系统;
  • 存取路径维护子系统;
  • 封锁子系统,执行并发控制;
  • 日志登记子系统,用以执行恢复任务。

这些子系统相互配合、紧密联系,构成了一个完整的数据存取系统。

12.4.2 数据存取层的功能子系统

数据存取层中有些子系统如封锁子系统、日志登记子系统等的功能,已在前面的章节中做了介绍,下面只做概要描述。

1. 记录存取、事务管理子系统

数据存取层不涉及存储分配、存储结构及有关参数,只在数据的逻辑结构上操作,因而可以把各种物理实现形态隐蔽起来。

记录存取子系统提供按某个属性值,直接取一个元组和顺序取一个元组的存取原语。这种存取运算,是按已选定的某个逻辑存取路径进行的,如某个数据文件或某个索引。这类存取操作的例子有:

  • 在某个存取路径上,按属性值找元组 find
  • 按相对位置找元组 next, prior, first, last
  • 给某关系增加一个元组 insert
  • 从找到的元组中,取某个属性值 get
  • 从某关系中,删去一个元组 delete
  • 把某修改完的元组写回关系中 replace

事务管理子系统提供定义和控制事务的操作。数据库中事务是并发控制和恢复的基本单位。事务管理的基本操作有:

  • 定义事务开始 begin transaction
  • 事务提交 commit
  • 事务回滚 rollback

事务管理子系统提供的这些操作,将登记进日志文件中。

2. 日志登记子系统

日志登记子系统和事务管理子系统紧密配合,完成关系DBMS对事务和数据库的恢复任务,它把事务的开始、回滚、提交,对元组的插入、删除、修改,以及对索引记录的插入、删除、修改等每个操作,都作为一个日志记录存入日志文件中。当事务或系统软、硬件发生故障时,利用日志文件执行恢复。与日志文件有关的主要操作有:

  • 写日志记录 writelog
  • 读日志记录 readlog
  • 扫描日志文件 scanlog
  • 撤销尚未结束的事务 undo
  • 重做已经结束的事务 redo

3. 控制信息管理模块

该模块利用专门的数据区(内存中),登记不同记录类型、以及不同存取路径的说明信息(取自数据字典)和控制信息,这些信息是存取元组和管理事务的依据。控制信息管理模块和记录存取、事务管理子系统一起保证事务的正常运行。该模块还提供对数据字典中说明信息的读取、增加、删除和修改操作

4. 排序/合并子系统

在语言处理层中,描述性语言表达的集合级操作,被转换成一系列对数据存取层所提供的存取原语的调用。为了得到用户所要求的有序输出,为了加速关系运算(如自然连接)的中间步骤,常常需要对关系元组重新排序,这一工作由排序/合并子系统来完成。下面列举排序操作的若干主要用途
(1)输出有序结果:例如,用户提出如下查询要求,若 EMP 表上的 Salary 属性已建有索引(如 B + B^+ B+ 树),则可顺序扫描索引以获得要求的输出。若 Salary 上没有索引,则必须对 EMP 表按 Salary 的属性值降序排序,以得到所要的结果。

select Eno, Salary
from EMP
order by Salary desc;

(2)数据预处理:对于并、交、差、分组聚集、连接、取消重复值、属于、不属于等关系运算,当参与运算的关系无法全部放入内存时,先对其进行排序预处理,再在有序表上执行相应操作,是降低处理代价的常用手段,它可将操作代价由 O ( n 2 ) O(n^2) O(n2) 降低到 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2n)
(3)支持动态建立索引结构 B + B^+ B+ 树是数据库中常用的索引结构, B + B^+ B+ 树的叶页索引记录形式为 (键值, TID) ,其中 TID 为元组标识符。TID 可用元组逻辑记录号、主键值或数据块号+位移等表示。索引记录在 B + B^+ B+ 树的叶页上是顺序存储的,因此在初建 B + B^+ B+ 树索引时,首先要对 (键值, TID) 进行排序
(4)减少数据块的存取次数:通过 B + B^+ B+ 树索引存取元组时,首先得到 (键值, TID) 集合,然后根据 TID 存取相应的元组。当 TID 是用数据块号+位移来表示时,可以首先对 TID 排序,使相同或临近块号的 TID 聚集在一起,然后按数据块号顺序存取物理数据块,避免无序状态下重复读块的情况,减少数据块的存取次数。

排序操作的用途还有很多,这里就不一一列举了。由此可见,排序操作是记录存取子系统、存取路径维护子系统都要经常调用的操作。它对提高系统效率,具有关键的作用。因此,排序子系统的设计十分重要,应采用高效的外排序算法(因为排序的数据量很大,所以要使用外排序算法)。

5. 存取路径维护子系统

对数据执行插入、删除、修改操作的同时,要对相应的存取路径进行维护。例如,若用 B + B^+ B+ 树索引作为存取路径,则对元组进行插入、删除、修改操作时,也要动态地维护该表上已经建立的所有 B + B^+ B+ 树索引,插入、删除相应的索引项;否则,就会造成 B + B^+ B+ 树索引与数据库表的不一致,当再通过 B + B^+ B+ 索引结构存取元组时,就会造成操作失败或错误结果。

6. 封锁子系统

封锁子系统完成并发控制功能。有关封锁的概念和技术,包括封锁类型、封锁相容矩阵、死锁处理、可串行性准则、两段锁协议等,已在第11章中详细讨论。这里只说明以下两点:
(1)在操作系统中,也有并发控制问题,其实现并发控制的方法通常也采用封锁技术。数据库管理系统的封锁技术,与操作系统的封锁技术相比(见下表),内容更加丰富,技术更加复杂。

(2)数据库管理系统中,封锁子系统设计的难点不仅在于技术复杂,而且在于其实现手段依赖于操作系统提供的环境(封锁子系统设计的关键!)。如封锁表的设计,由于封锁表必须能为多个进程共享,能动态建立和释放,因此封锁表的设计,就随操作系统环境而异。


12.5 缓冲区管理

数据存取层的下面是数据存储层,该层的主要功能是存储管理,包括缓冲区 buffer 管理、内外存交换、外存管理等。其中缓冲区管理是十分重要的,数据存储层向数据存取层提供的接口,是由定长页面组成的系统缓冲区

系统缓冲区的设立,出于两方面的原因:一是它把数据存储层以上各系统成分,和实际的外存设备隔离,外存设备的变更不会影响到其他系统成分,使关系DBMS具有设备独立性;二是提高存取效率

关系DBMS利用系统缓冲区缓存数据

  • 当数据存取层需要读取数据时,数据存储子系统首先到系统缓冲区中查找。只有当缓冲区中不存在该数据时,才真正从外存读入该数据所在的页面。
  • 当数据存取层写回一元组到数据库中时,存储子系统并不把它立即写回外存,仅把该元组所在的缓冲区页面作一标志,表示可以释放。只有当该用户事务结束、或缓冲区已满需要调入新页时,才按一定的淘汰策略,把缓冲区已有释放标志的页面,写回外存。
  • 这样操作,可以减少内外存交换的次数,提高存取效率。

系统缓冲区可由外存或虚存组成。由于内存空间紧张,缓冲区的大小、缓冲区内存和虚存部分的比例需要精心设计,针对不同应用和环境,按一定的模型进行调整。既不能让缓冲区占据太大的内存空间,也不能因其空间太小而频频缺页、调页,造成抖动,影响效率。下图给出了缓冲区及上下接口示意图:

可见,缓冲区由控制信息和若干定长页面组成。缓冲区管理模块向上层提供的操作是:缓冲区的读 READBUF 、写 WRITEBUF 。缓冲区内部的管理操作有:查找页、申请页、淘汰页。缓冲区管理调用操作系统的操作有:读 READ 、写 WRITE 。以读操作为例,缓冲区管理的大致过程如下图所示:

可以看到,缓冲区管理中的主要算法是淘汰算法和查找算法。操作系统中有许多淘汰算法可以借鉴,如先进先出算法 FIFO最近最少使用算法 LRU最不经常使用 LFU 以及它们的各种改进算法;查找算法用来确定所请求的页是否在内存,可采用顺序扫描折半查找hash 查找等算法。


12.6 数据库的物理组织

本文前几节,从数据库管理系统最外层的语言处理层开始,逐步深入地讨论了数据存取层、数据存储层等各层的系统结构、功能、任务以及实现技术。下面将进入数据库本身,介绍数据库的物理组织。

数据库是大量数据的、有结构的综合性集合。如何将这样一个庞大的数据集合,以最优的形式组织起来并存放在外存上,是一个非常重要的问题。所谓最优应包括两方面:一是存储效率高,节省存储空间;而是存取效率高、速度快、代价小

数据库实现的基础是文件,对数据库的任何操作最终都要转化为对文件的操作。所以,在数据库的物理组织中,基本问题是如何设计文件组织,或者利用操作系统提供的、基本的文件组织方法。这里不打算讨论文件组织的基本方法、以及常用的文件组织形式,这些是数据结构的内容,而主要讨论如何利用基本的文件组织方法来实现数据库组织

数据库系统是文件系统的发展。文件系统中,每个文件存储同质实体的数据,各文件是孤立的,没有体现实体之间的联系。数据库系统中数据的物理组织,必须体现实体之间的联系,支持数据库的逻辑结构——各种数据模型。因此,数据库中要存储四方面的数据:

  • 数据描述,即数据外模式、模式、内模式;
  • 数据本身;
  • 数据之间的联系;
  • 存取路径

这四个方面的数据内容,都要采用一定的文件组织方式组织、存储起来。

1. 数据字典的组织

有关数据的描述,存储在数据库的数据字典中。数据字典的特点是数据量比较小(与数据本身比)、使用频繁,因为任何数据库操作都要参照数据字典的内容。

  • 在网状、层次数据库中,数据字典常常用一个特殊的文件来组织——所有关于数据的描述信息,都存放在一个文件中,如HP 3000计算机系统中IMAGE网状数据库的模式,就是用一个称为“根文件”的特权文件来存放的。
  • 关系数据库中则不同,数据字典的组织通常与数据本身的组织相同,数据字典按不同的内容、在逻辑上组织为若干张表,在物理上可以将一张数据字典表对应一个物理文件,由操作系统负责存储管理;也可以将若干张字典表对应一个物理文件,由关系DBMS负责存储组织和管理。

2. 数据及数据联系的组织

关于数据自身的组织,数据库管理系统可根据数据和处理的要求,自己设计文件结构;也可从操作系统提供的文件结构中,选择合适的加以实现。目前,操作系统提供的常用文件结构由顺序文件、索引文件、索引顺序文件、hash 文件和 B B B 树类文件等。

数据库中,数据组织和数据之间的联系是紧密结合的。在数据的组织和存储中,必须直接或间接、显式或隐含地体现数据之间的联系,这是数据库物理组织中主要考虑和设计的内容。

  • 在网状和层次数据库中,常用邻接法链接法实现数据之间的联系。对应到物理组织方式中,就要在操作系统已有的文件结构上、实现数据库的存储组织和存取方法。例如,IMS数据库中,操作系统提供的低级存取方法有顺序存取方法 SAM索引顺序存取方法 ISAM虚拟顺序存取方法 VSAM溢出顺序存取方法 OSAM 。在此基础上,IMS数据库管理系统设计了层次顺序存取方法 HSAM层次索引顺序存取方法 HISAM层次直接存取方法 HDAM层次索引直接存取方法 HIDAM 四种数据库的存储组织和相应的存取方法。其中,层次顺序存取方法 HSAM 按照片段值的层次序列码的次序,顺序存放各片段值,而层次序列码体现了数据之间的父子和兄弟联系。这是一种典型的、按物理邻接方式、实现数据之间联系的方法,在这种存储方法中,整个数据库中不同片段型的数据,均存储在一个 SAM 文件中。
  • 网状数据库中最常用的组织策略是各记录型分别用某种文件结构组织,记录型之间的联系—— SET 用指引方式实现。即在每个记录型中,增加数据库管理系统控制和维护的系统数据项——指引元,它和用户数据项并存于同一个记录中。
  • 关系数据库实现了数据表示的单一性。实体及实体之间的联系,都用一个数据结构——“表”来表示,因此数据和数据之间的联系,它们二者的组织方式相同。在数据库的物理组织中,与数据字典类似,可以一个表对应一个物理文件,由操作系统负责存储管理;也可以多个表对应一个物理文件,由关系DBMS负责存储组织和管理。

3. 存取路径的组织

在网状和层次数据库中,存取路径是用数据之间的联系来表示的,因此已与数据结合并固定下来。

在关系数据库中,存取路径和数据是分离的,对用户是隐蔽的。存取路径可以动态建立与删除。存取路径的物理组织,通常采用 B B B 树类文件结构和 hash 文件结构。在一个关系上,可以建立若干个索引。有的系统支持组合属性索引,即在两个或两个以上属性上建立索引。索引可由用户用 create index 语句建立、用 drop index 删除。在执行查询时,数据库管理系统的查询优化模块,也会根据优化策略自动建立索引,以提高查询效率。由此可见,关系数据库中存取路径的建立是十分灵活的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

memcpy0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值