Skip to content

Lecture 3

Database Storage Part 1

Storage

默认情况下,数据库会认为数据是存储在非易失性存储器上的。

Storage Hierarchy

  • Registers
  • Cache
  • DRAM
  • SSD
  • HDD
  • Network Storage

前三个是易失的,可随机访问,是Byte Addressable的。后三个是非易失的,可顺序访问,是Block Addressable的。

也就是说,对于后三者,我们需要先读取一个Block,然后再从Block中读取Byte。

系统设计的目标:允许系统管理超过DRAM容量的数据;尽可能减少stalls和速度降级。

Disk-Oriented DBMS

解决OS的读写问题:

  • madvise:告诉OS你希望如何读取数据
  • mlock:告诉OS不能被swap出去的数据
  • msync:告诉OS你希望如何写入数据

尽可能获取对数据的控制权,减少OS的影响。

File Storage

DBMS以一个或多个文件的形式存储数据库,而OS并不知道文件内容。Storage Manager负责管理文件的读写, 以页为单位存储数据。

Database Pages

页是一个固定大小的数据块。每一页都有一个给定的标识符。页大小一般是固定的,通常是4KB。

Database Heap

堆是页的无序集合,页中的元组也是无序存储的。需要元数据来跟踪哪一页存在、哪一页有空间。可以用两种方式来表示堆文件:链表和页目录。

Heap File: Linked List

Header Page储存了两个指针:第一个页和第一个空闲页。每一页都会跟踪自己内部的空闲空间。

Heap File: Page Directory

Header Page储存了一个页目录,每个目录项包含了页的位置和空闲空间。

每一页都包含一个Header,Header中包含了页的元数据,包括页的大小、Checksum(校验和)、DBMS版本号、Transaction Visibility(事务可见性)、Compression Information(压缩信息)等。

一些系统要求页需要为self-contained,即页中的数据需要包含页的元数据。

Page Layout

有两种方式来安排页中的数据:Tuple-Oriented和Log-Structured。

Tuple-Oriented

Strawman Idea;记录页中元组个数,新元组直接插入到页尾。

Slotted Page:页中包含一个Slot Array,每个Slot指向一个元组。槽数组从页首开始,向页尾增长;元组从页尾开始,向页首增长。

Log-Structured

与Tuple-Oriented不同,Log-Structured只会记录log records,也就是记录数据库的变化,记录插入、删除、更新等操作。

每一个页都有一个独特的record identifier,通常是page_id+offset/slot,也可以再加上一个位置信息。

Tuple Layout

一个tuple由一个header和一个attribute data组成。Header中包含可见性信息、NULL信息。Attribute Data中包含实际的数据,通常以创建表格时定义的顺序存储。

可以去规范化数据,把它们一起存储在一个页中,这样或许能减少I/O操作,但可能会增加更新的代价。这是一个非常老的想法,现在仍会被用到。

Conclusion

数据库以页为单位存储数据。本节课涉及到了页的组织方式、元组的组织方式、页的元数据等内容。