首页 > 代码库 > SQLite页面管理

SQLite页面管理

1 页面管理器:是访问本地数据库和日志的唯一模块(通过操作系统API)。它把随机访问系统或面向字节的文件系统抽象成数据库文件(基于页的随机访问系统)。它定义了一套与文件系统无关的接口来访问数据库文件。B树使用页面管理模块的接口访问数据库,而非直接访问数据库或日志文件。B树把数据库文件视为大小均匀的逻辑队列。除内存数据库外,一般的数据库都是把数据库文件存在于磁盘上,用的时候读入内存,操作之,有需要的话再写回内存。一般情况下,数据库文件会比较大。有因为内存有限,所以在内存中只保持一小快的数据库文件,这块内存叫做database cache或data buffer,在SQLite中叫做page cache。

对于每一个数据库文件,在文件和缓存之间移动页面是页面管理器的基本功能。移动页面对B+树和其他高层模块是透明的。页面管理器是文件系统与这些高层模块的中间人,是的这些模块可以直接访问页面内容,也负责把页写回数据库文件。他建立其了一个抽象,数据库就是主存中的页的队列。页面管理器也提供了其他功能:事务管理(实现ACID,并发的控制和恢复,原子的提交和回滚),数据管理(协调数据库文件到缓冲区的页的读写,文件空间管理),日志管理(向日志文件写入记录),锁管理(确保事务在访问文件之前已经获得对数据库文件的相应的锁)。总之,页面管理实现了存储的持久性和事务的原子性。

上层模块完全从低级别的锁和日志管理机制绝缘,他们不知道锁和日志的活动。B+树只看到每个事务的级别,不管具体实现。页管理器把一个事务拆分成锁操作,日志操作,对数据库文件的读写操作。B+树以页号请求一个页,页管理器返回一个指向已加载到缓冲区的页的内容的指针。在对页改动时,B+树模块通知页管理器在日志文件里保存相应的信息以应对可能的恢复,并且要获得对相应数据库文件的锁。B+树在用完一个页时通知页管理器,如果页面被更改,则写回文件。

 

2 页面管理器接口结构:实现了名为Pager的数据结构,每个打开的数据库文件对应着唯一一个Pager对象,数据库文件和Pager对象几乎等价。B+树想用一个数据库文件时,就新建一个Pager对象,使用对象的句柄对文件进行操作。页模块用句柄跟踪关于文件的锁,日志文件,数据库的状态,日志状态等。

 

3 缓存管理:SQLitre为每个打开的数据库文件维护一个单独的页缓冲区。如果一个线程两次或多次打开相同的文件,页管理器只会对第一个打开调用建立单独的页缓冲区。内存数据库内存数据库不设计任何外部设备,但是他们也被像本地文件一样对待,全部都在缓冲中。因此,B/B+树用相同的接口来访问数据库。

页缓冲区位于应用程序的内存空间。相同的页也可能被操作系统所缓存。当应用程序要读任意文件的内容时,操作系统先用自己缓存的备份,再用应用程序的缓存备份。SQLite的页缓冲和区的组织和管理是独立于操作系统的。页面缓存的管理是系统性能的关键。

3.1 缓冲区组织:为了加快搜索缓存速度,内存中缓存项目都会有比较好的组织。SQLite用哈希组织缓存页,用页槽存储表中的页。缓冲区是全相连的,即任何槽可以存储任何页面。哈希表最初是空的,页面管理器创建了新的槽并把其插入哈希表中。一个缓冲区能存储的槽有个最大值,而内存数据库中无限制(只要操作系统允许应用程序的用户空间增长)。

哈希表中的每一页都有一个PgHder类型的对象,接着是page image,接着是一些私有数据(B+树用来存储页面具体控制信息)。内存数据库没有日志文件,所以他们的恢复信息被记录在内存对象中。指向这些对象的指针指向这些对象的指针在私有内容之后,这些指针被页管理其使用。当页管理器把页调入缓冲区时,被初始化为零。在缓冲区的所有的页面都可以通过哈希表访问,

 

SQLite页面管理