数据库管理系统
数据库管理系统的基本功能
数据库定义和创建
创建数据库主要是用 数据定义语言 定义和创建数据库 模式、外模式、内模式 等数据库对象。并存储在数据字典中,是数据库管理系统运行的基本依据。
【例】创建数据库(或模式)、表、视图、索引等,还有创建用户、安全保密定义(如用户口令、级别、角色、存取权限)、数据库的完整性定义。
数据组织、存储和管理
数据库管理系统要分类组织、存储和管理各种数据,包括 数据字典、用户数据、存取路径 等。
目标是提高存储空间利用率和方便存取,提供多种存取方法(如索引查找、hash 查找、顺序查找等)以提高存取效率。
任务是以某种文件结构和存取方式在存储器上组织这些数据,实现数据之间的联系。
数据存取
数据库管理系统提供用户对数据的操作功能,实现对数据库数据的检索、插入、修改和删除。
两类数据库操作语言: 宿主型语言和自立(独立)型语言 。
数据库事务管理和运行管理
对多用户环境下的事务管理功能和安全性、完整性控制功能;数据库恢复、并发控制和死锁检测(或死锁防止、安全性检查)和存取控制、完整性检查和执行、运行日志的组织管理等。这些功能保证了数据库系统的正常运行,保证了事务的 ACID 特性。
数据库的建立和维护
数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组织和重构造以及性能监测分析等。
其他功能
数据库管理系统与网络中其他软件系统的通信功能;一个数据库管理系统与另一个数据库管理系统或文件系统的数据转换功能;异构数据库之间的互访和互操作功能等。
数据库管理系统的系统结构
数据库管理系统的层次结构
将数据库管理系统划分成若干层次,有利于清楚地认识数据库管理系统,同时有助于数据库管理系统的设计和 维护。
【例】 IBM 公司最早研制的 SystemR,其核心分为底层的关系存储系统(RSS)和上层的关系数据系统(RDS)。
RSS :空间和设备管理、索引和存取路径管理、事务管理、并发控制、运行日志管理和恢复等。
RDS :语法检查与分析、优化、代码生成、视图实现、安全性完整性检查等。
【说明】
- 数据存储层 :处理数据页和系统缓冲区。
- 数据存取层 :处理单个元组把集合操作化为单记录操作并执行。
- 语言翻译处理层 :处理数据库语言,如 SQL 向上提供的数据接口是元组的集合。
- 应用层 :处理各种各样的数据库应用是 RDBMS 与用户/应用程序的界面。
关系数据库管理系统的运行过程示例
关系数据库管理系统是一个复杂而有序的整体,我们应该用 动态的观点 看待关系数据库管理系统的各个功能模块。
【例】应用程序/用户通过关系数据库管理系统读取数据库种数据的过程。具体如下图:
【说明】
- 用户 A 通过应用程序 A 向关系数据库管理系统发出调用数据库数据的命令,如 SELECT 命令,命令中给出了一个关系名和查找条件。
- RDBMS 首先对命令进行语法检查,检查通过后进行语义检查和用户存取权限检查。
- RDBMS 执行查询优化,并把该命令转换成一串单记录的存取操作序列。
- RDBMS 执行存取操作序列(反复执行以下各步,直至结束)。
- RDBMS 首先在系统缓冲区中查找记录,若找到满足条件的记录则转 到(10), 否则转到(6)。
- RDBMS 查看存储模式,决定从哪个文件、用什么方式读取哪个物理 记录。
- RDBMS 根据(6)的结果,向操作系统发出读取记录的命令。
- 操作系统执行读数据的有关操作。
- 操作系统将数据从数据库的存储区送至系统缓冲区。
- RDBMS 根据查询命令和数据字典的内容导出用户所要读取的记录格式。
- RDBMS 将数据记录从系统缓冲区传送到应用程序 A 的用户工作区。
- RDBMS 将执行状态信息,如如成功读取或不成功的错误指示、例外状态信息等返回给应用程序 A。
结合 RDBMS 的层次机构,以上 12 个动作可以大致分为以下的对应关系:
动作(1)属于第一层——应用层。
动作(2)、(3)由第二层——语言处理层来完成。
动作(4)、(10)、(11)、(12)由第三层——数据存取层来完成。
动作(5)、(6)、(7)由第四层——数据存储层来进行。
动作(8)、(9)由操作系统执行。
语言处理层
关系数据库管理系统一般向用户提供多种形式的语言,这些语言都是由 语言处理层 来支持的。
语言处理层的任务和工作步骤
语言处理层任务: 把用户在各种方式下提交给 RDBMS 的数据库语句转换成对 RDBMS 内层可执行的基本存取模块的调用序列。
【说明】
数据库语言通常包括 数据定义语言 、 数据操纵语言 和 数据控制语言 三部分。其中数据定义语句的处理相对独立和简单。
数据字典是数据操纵语句的处理、执行以及 RDBMS 运行管理的基本依据 。数据字典通常应用关系表来表示,如下图:
对数据操作语言,语言处理层做的工作较多,具体如下图:
处理过程为:
- 针对数据操纵语句进行词法分析和语法分析,并把外部关系名、属性名转换为内部名。
- 根据数据字典中的内容进行查询检查,包括审核用户的存取权限和完整性检查。
- 对查询进行优化。包括代数优化、存取路径优化。
总之,将数据操纵语句转换成一串可执行的存取动作,这一过程称为一个逐步束缚的(bind)过程。
根据束缚时间可分为:解释方法即在执行时束缚,预编译方法即在执行前束缚。
解释方法
解释方法的做法:在执行前,数据操纵语句都以原始字符串的形式保存;当执行到该语句时,解释程序去完成束缚过程,同时予以执行。目前主要用在交互式 SQL 语言中。
优点: 数据独立性好、灵活、应变性好。
缺点: 效率比较低。
预编译方法
预编译方法的基本思想: 用户提交数据操纵语句之后,在运行之前对它进行翻译处理,保存产生好的可执行代码。当需要运行时,取出保存的可执行代码加以执行。
以 DB2 数据库处理嵌入 SQL 语句的应用程序的过程为例,具体处理过程如下图:
处理过程为:
- 源程序 P 经预编译器处理,识别 SQL 语句,生成数据库请求模块 DBRM 模块。
- 源程序按照通用方式被编译、链接处理,生成装载模块。
- 束缚依据数据字典和存取模块,生成应用规划。应用规划包括了对基本存取模块的调用,完成对应 SQL 语句的功能。
- 在运行时当装载模块遇到访问数据库时,九八控制权交给运行监督器。
- 运行监督器找到其应用规划,并调入内存并转让控制权。
- 应用规划启动数据存储器存取实际数据,将结果返回应用程序。
存在问题: 应用规划失效,即会出现在束缚过程中进行优化所依据的条件可能在运行前就不存在了,例如数据库结构改变、存取路径改变。
解决方法:
重编译方法,即当数据库中因某些成分的改变而使一些程序(语句)的编译结果无效时,再进行一次编译。
重编译不应该在数据库刚改变时就立即执行;较好的方法是将受影响的编译结果设置为“无效”,当被执行时才进行自动重编译。
自动重编译技术的优点: 既拥有了编译时进行束缚所带来的高效率,又具备了执行时束缚带来的数据独立性。
数据存取层
数据存取层介于语言处理层和数据存储层之间。它向上提供单元组接口,即导航式的 一次一个元组的存取操作;向下则以系统缓冲区的存储器接口作为实现基础,其接口关系如下图:
数据存取层的主要任务为:
- 提供一次一个元组的查找、插入、删除、修改等基本操作。
- 提供元组查找所循的存取路径以及对存取路径的维护操作,如对索引记录的查找、插入、删除、修改。若索引是采用 B+树,则应提供 B+树的建立、查找、插入、删除、修改等功能。
- 对记录和存取路径的封锁、解锁操作。
- 日志文件的登记和读取操作。
- 其他辅助操作,如扫描、合并/排序,其操作对象有关系、有序表、索引等。
数据存取层的系统结构
数据存取层包括多个功能子系统,其系统结构及所包括的子系统和模块如图:
数据存取层的功能子系统
记录存取、事务管理子系统
记录存取子系统
提供按照某个属性值直接取一个元组和顺序取一个元组的存取原语。如下列操作:
- 在某个存取路径上按属性值找元组(FIND):
- 按相对位置找元组(NEXT, PRIOR, FIRST, LAST);
- 给某关系增加一个元组(INSERT);
- 从找到的元组中取某个属性值(GET);
- 从某关系中删去一个元组(DELETE);
- 把某修改完的元组写回关系中(REPLACE)。
事务管理子系统
提供定义和控制事务的操作。如下列操作:
- 定义事务开始(BEGIN TRANSACTION);
- 事务提交(COMMIT);
- 事务回滚(ROLLBACK)。
日志登记子系统
日志登记子系统和事务管理子系统紧密配合,完成关系数据库管理系统对事务和数据库的恢复任务。相关的操作有:
- 写日志记录(WRITELOG)
- 读日志记录(READLOG)
- 扫描日志文件(SCANLOG)
- 撤销尚未结束的事务(UNDO)
- 重做已经结束的事务(REDO)
控制信息管理模块
利用专门的数据区登记不同记录类型以及不同存取路径的说明信息和控制信息,为存取元组和管理事务提供依据。
排序/合并子系统
该系统完成关系元组的重新排列,以满足用户的有序输出或加速关系运算的中间步骤。主要用途如下:
输出有序结果
【例】
SELECT Eno,Salary
FROM EMP
ORDER BY Salary DESC;
若 EMP 表上的 Salary 上没有索引,则必须对 EMP 表按 Salary 的属性值降序排序。
数据预处理
对于并、交、差、分组聚集、连接、取消重复值、属于、不属于等关系运算,当参与运算的关系无法全部放入内存时,先对其进行排序预处理,再在有序表上执行相应操作,这样可以提高效率。
支持动态建立索引结构
在 B+树建立索引结构对的时候需要对元组标识符(TID)进行排序
减少数据块的存取次数
利用 B+树索引存取元组时,首先对 TID 排序,使相同或临近块号的 TID 聚集在一起,然后按数据块号顺序存取物理数据块,避免无序状态下重复读块的情况, 减少数据块的存取次数。
存取路径维护子系统
对数据执行插入、删除、修改操作的同时对相应的存取路径进行 维护 。
【例】用 B+树索引作为存取路径,则对元组进行插入、删除、修改操作时要在该表上已建立的所有 B+树索引进行动态维护。
封锁子系统
完成并发控制功能
- 数据库系统的封锁与操作系统的封锁对比如下表。
- 数据库系统中封锁子系统设计的难点不仅在于技术复杂,还在于实现手段依赖操作系统提供的环境。
操作系统 | 数据库管理系统 | |
---|---|---|
封锁对象 | 单一,系统资源(包括 CPU、设备、表格等) | 多样,数据库中各种数据对象(包括用户数据、索引(存取路径)、数据字典等) |
封锁对象的状态 | 静态、确定;各种封锁对象在封锁表中占有一项;封锁对象数是不变的 | 动态,不确定;封锁对象动态改变,常常在执行前不能确定;一个封锁对象只有当封锁时才在封锁表中占据一项 |
封锁的粒度 | 不变,由于封锁对象单一、固定,封锁粒度不会改变 | 可变,封锁可加到或大、或小的数据单位上,封锁粒度可以是整个数据库、记录或字段 |
封锁的类型 | 单一,排他锁 | 多样,一般有共享锁(S Lock)、排他锁(X Lock)或其他类型的封锁,随系统而异 |
缓冲区管理
数据存取层的下面是 数据存储层 。该层的主要功能是存储管理,包括缓冲区(buffer)管理、内外存交换、外存管理等。数据存储层向数据存取层提供的接口是由定长页面组成的系统缓冲区。
系统缓冲区设立的原因
- DBMS 的设备独立性 :外存设备变更不会对它们造成影响。
- 提高存取效率 :预先读,延迟写。
系统缓冲区的组成
由内存或虚存组成,缓冲区的大小、缓冲区内存和虚存部分的比例要精心设计,并动态调整。否则会出现“抖动”。缓冲区及上下接口示意图如下:
缓冲区内部管理操作
主要有 查找页、申请页、淘汰页 。调用操作系统的操作有 读 和 写 。以读为例,缓冲区的管理过程大致如图所示:
【说明】
- 缓冲区管理中主要算法是 淘汰算法 和 查找算法 。
- 常见的缓冲区淘汰算法有 FIFO(先进先出算法)、LRU(最近最少使用的先淘汰算法) 等。
- 缓冲区查找算法: 顺序查找算法、折半查找算法、hash 查找算法 等。
数据库物理组织
如何将庞大的数据集合以最优的形式组织起来存放在外存上是一个非常重要的问题。
最优是指:存储效率高,节省存储空间;存取效率高,速度快,代价小。
数据库通过文件的方式存储数据库以下 4 类数据 :
- 数据外模式、模式、内模式。
- 数据本身。
- 数据之间的联系。
- 存取路径。
数据字典的组织
有关数据的描述存储在数据库的数据字典中。其特点是数据量比较小、使用频繁。
数据字典的存储方式;
方式一:数据字典可以有多个表,在物理上可以将一个数据字典对应一个物理文件,由操作系统负责存储管理。
方式二:在物理上可以将若干数据字典表对应一个物理文件,由 RDBMS 系统负责存储管理。
数据及数据联系的组织
数据库管理系统可以根据数据和处理的要求自己设计文件结构,也可以从操作系统提供的文件结构中选择合适的加以实现。
操作系统提供的文件格式有顺序文件、索引文件、索引顺序文件、hash 文件、B 树类文件等。
数据库物理组织中主要考虑和设计的是数据的组织和存储中必须直接或间接、显示或隐含地体现数据之间的联系。
在关系数据库中因为数据和数据之间的联系用“表”表示,所以物理组织中可以用前面提到的数据字典的两种物理存储方法。
在网状数据库中实现的方式是指引元,即增加数据库管理系统控制和维护的系统数据项——指引元,并与数据项在一个记录中。
存取路径的组织
网状、层次数据库存取路径是用数据之间的联系来表示的,已与数据结合并固定下来。
在关系数据库中存取路径和数据是分离的,对用户是隐蔽的,并动态建立和删除。通常采用 B 树类文件结构和 hash 文件结构。