最近想系统的学习DBMS实现方面的知识,并记录学到的一点一滴,于是准备在博客园上发表一系列这方面的知识,主要是根据《数据库实现》这本书,把自己的理解进行总结,希望各位园友不吝赐教,小弟感激不尽。
王珊老师有云:数据库就是数据的仓库。数据库管理系统就是对数据仓库进行管理。数据库的基本功能就是为了方便用户对数据的存取和操作。普通的文件也可以存储数据,但是不方便对数据进行统一管理。下面从整体上介绍下DBMS应该具有哪些模块。
一个DBMS首先应该有自己的内存管理模块,如果频繁的和操作系统进行空间的申请和释放,会严重影响一个DBMS的性能,据说QQ也是自己进行管理的。其次需要存储管理,如插入记录或者查询记录,最终都要反映到文件上,再底层就是磁盘上,OS的文件系统已经封装了对磁盘的操作,DBMS又不能仅仅按照OS的文件系统进行存储管理,DBMS应该在OS之上,对存储进行更进一步的管理,记录当然可以在文件中顺序存储,但一般DBMS都是按照B树的方式进行存储,这样对定位数据十分有利。频繁的和磁盘进行交互,严重影响DBMS的性能,于是缓冲区管理模块是必须滴。上面就是几个比较底层的模块:内存管理,存储管理,缓冲区管理。
用户通过SQL语句进行数据库的管理和操作,SQL语句又分为DDL和DML。所以需要DDL和DML编译器,对SQL语句进行语法分析,并生成执行计划,最后将执行计划送到执行引擎,执行执行计划。DML是SQL中使用最多的语句,SELECT又是DML中使用最多的语句,查询一般是将SELECT语句转化为内部语法树,然后查询优化器根据规则将语法树转化为有效的等价的形式,最后生成执行计划,下面举例说明(http://www.xinx.sdnu.edu.cn/sfzx/jpsykc/wh/wh04.html):
3 |
WHERE
Student.Sno=SC.Sno |
这条含有JOIN的SELECT语句首先转化为内部的语法树,形式如下:
语法树然后转化为关系代数语法树,形式如下:
通过查询优化器,对查询进行优化,这里用到了关系代数的优化,后面再讲。可以将SC.CNO='2'的选择操作符降到低层,如下所示:
有时需要一系列操作作为一个整体的单位进行执行,事务的概念便被提出来了,如银行转帐操作就是一个事务。事务具有ACID的性质,为了保证事务的这些特性,需要日志和恢复系统,当DBMS遇到故障时,可以根据日志做一些REDO和UNDO操作,保证事务的原子性和持久性。同时事务之间可能有并发现象,并发可能导致脏读,不可重复读,幻读,导致这些的原因是对公共资源的操作存在交叉,于是需要对资源进行上锁,锁机制也是事务的一个模块。
一个基本的DBMS应该具有上述的几个模块,当然还有一些高级的模块,如数据库备份,权限管理等。
最后给出书中的一个模块划分图。
|