Skip to content

Lecture 4

Database Storage Part 2

Storage

File Organization

Slotted Pages

页中的元组是变长的,所以需要一个额外的数据结构来存储元组的位置信息。这个数据结构叫做Slot,每个Slot对应一个元组。

Log-Structured File Organization

Log-Structured File Organization是一种基于日志的文件组织方式。它将所有的更新操作都记录在一个日志中。DBMS只储存日志记录,而不是直接记录数据。如果需要读取数据,DBMS会先读取日志,然后重新构建数据。使用indexes可以加速找到日志的位置。周期性地compact(压缩)日志可以减少读取的时间。

Data Representation

元组只是字节的序列,可以使用不同精度的数据类型来表示数据,如Integer、Float、Decimal、Date、Time、String等。

不同数字类型有不同的精度和范围,使用过程中要避免舍入误差的问题。使用带有元数据、精确、可变长的二进制表示可以解决这个问题。

Postgres:Numeric

用C语言来表示储存细节:

C
1
2
3
4
5
6
7
typedef unsigned char NumericDigit;
typedef struct {
    int ndigits; // number of digits in digits[]
    int weight; // weight of first digit
    int sign; // NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN
    NumericDigit *digits; // array of digits, most significant first
} numeric;

Large Values

大多数DBMS都不允许元组的大小超过一个页的大小。为了存储大的数据,DBMS会将数据分割成多个页,然后使用指针来连接这些页,即seperate overflow storage pages。

External Value Storage

有时候,元组中的数据可能会很大,不适合存储在页中。这时候可以使用外部存储,将数据存储在文件中,然后在页中存储指向文件的指针。DBMS无法直接访问外部存储,也无法提供一些保护,如durability(持久性)、transaction(事务)等。