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¶
数据库以页为单位存储数据。本节课涉及到了页的组织方式、元组的组织方式、页的元数据等内容。