Storage and File Structure¶
约 4165 个字 9 张图片 预计阅读时间 17 分钟
这一节中的许多内容都可以在计组笔记中找到对应之处
Overview of Physical Storage Media¶
在数据库的物理层面上,文件被保存在存储空间中(例如.mdf、.idf、.ora、.dbf 等)
不同的存储介质可以通过以下的标准进行区分:
- 数据的访问速度
- 存储每个单位数据的开销
- 可靠性
- 在断电或系统崩溃等情况下的数据丢失
- 存储设备发生了物理错误(使用 RAID)
Storages classified by reliability:
- Volatile storage: 断电后内容会丢失, e.g., DDR2, SDR.
- Non-volatile storage(非易失性存储器): 断电后内容会被保持
- Includes secondary and tertiary storage, as well as batter-backed up main-memory.
Storages classified by speed:
- Cache
- Main-memory
- Flash memory
- Magnetic-disk
- Optical storage
- Tape storage
Storage Hierarchy¶

- Primary storage: Fastest media but volatile (cache, main memory).
- Secondary storage (辅助存储器,联机存储器): next level in hierarchy, non-volatile, moderately fast access time
- Also called on-line storage
- E.g., flash memory, magnetic disks
- Tertiary storage (三级存储器,脱机存储器): lowest level in hierarchy, non-volatile, slow access time
- also called off-line storage
- E.g., magnetic tape, optical storage
Physical Storage Media¶
Cache:
- Fastest and most costly form of storage, volatile, and managed by the computer system hardware.
- Speed: \(\leqslant\) 0.5 nanoseconds (ns for short, 1 ns = \(10^{–9}\) seconds);
- size: ~ KB ~ MB
Main memory:
- Fast access (10 to 100 ns)
- Capacities: Generally too small (or too expensive) to store the entire database
- Capacities of up to a few Gigabytes (1GB = \(10^9\)) widely used currently
- Capacities have gone up and per-byte costs have decreased steadily and rapidly (roughly factor of 2 every 2 to 3 years)
- Volatile: contents of main memory are usually lost if a power failure or system crash occurs.
Flash memory(快闪存储器,闪存):
- Also known as EEPROM (Electrically Erasable Programmable Read-Only Memory,电可擦可编程只读存储器)
- Non-volatile: Data survives when power failure
- Write/Erase
- 一个位置只能写入一次数据,但是可以擦除后覆写
- 只支持有限次写入/擦除操作(\(10^4\) to \(10^5\) 次)
- 擦除时只能一次擦除整个内存
- Performance:
- Reads are roughly as fast as main memory (< 100ns)
- But writes are slow (~ 10µs), erase is slower
- Cost: per unit of storage roughly similar to main memory
Magnetic-disk:
- Storage: Data is stored on spinning disk, and read/written magnetically
- Primary medium for the long-term storage of data, typically stores entire database
-
要访问数据时必须把它从磁盘中转移到内存里,然后再写回到磁盘中。
与内存相比访问速度非常非常慢(耗时可以达到 10 万倍)
-
Direct-access: 可以按任意顺序直接访问磁盘上任意位置的数据
这些知识点感觉都好老...
Magnetic Disks¶

- 每个磁盘表面附近都有一个磁头,用于读取和写入数据(Read-write head)
- 用于读/写磁性编码的数据
- 磁盘(platter)表面会被分为很多个轨道(track),例如超过 50K 个
- 每个轨道都会被分为很多个扇区(sector),例如 512 字节一个扇区
- 扇区是进行数据读写的最小单位
- 内层轨道可能有 500 到 1000 个扇区,外层轨道可能有 1000 到 2000 个扇区
要读/写扇区上的数据时
- 磁臂(disk arm)移动到正确的轨道上
- 盘片开始旋转,当对应扇区经过磁头时,磁头就可以读取或写入数据
- 有时会让多个盘片共享同一个旋转轴,然后让这些盘片对应的磁头装载在同一个磁臂上,以提高读写速度
磁盘控制器(disk controller):计算机系统与磁盘驱动硬件之间的接口
- 接受来自于高层次的读/写扇区命令
- 负责执行相应操作,如把磁臂移动到正确的轨道上,然后读/写数据
- 计算校验和并把它附加到每个扇区上,以确保数据被正确读取
- 如果数据被破坏,那么计算出的校验和大概率与原来的校验和不一致
- 坏扇区的重映射
- 将该扇区从逻辑上映射到预留的物理扇区
- 并且重映射被记录在磁盘或其他非易失性存储器中
Performance¶
磁盘的访问时间(access time)是指从发出读/写命令到数据开始被传递的时间
Access time = seek time(寻道时间)+ rotational latency(旋转等待时间)
- Seek time:磁臂移动到正确的轨道所用的时间
- Rotational latency time:磁盘旋转到正确的扇区所用的时间
- 平均来说,旋转等待时间是一次完整旋转耗时的 ½
- Data-transfer rate(数据传输速率):每秒钟可以传输多少字节的数据
- 取决于计算机和磁盘之间的连接速度
- Mean time to failure (MTTF, 平均故障时间):
- 指的是磁盘在发生故障之前的能连续工作的平均时间
Optimization of Disk-Block Access¶
Block: 单个轨道上的连续扇区序列
- 数据在磁盘和主存之间传递以块为单位
- 大小从 512 字节到几千字节不等
- 使用较小的块会导致更多的传输次数
- 使用较大的块可能因为数据不连续而浪费空间
Disk-arm-scheduling algorithms(磁盘臂调度算法)
- 目标:对磁盘的访问次序进行优化,以最小化磁臂的移动次数
- Elevator algorithm (电梯算法):
- 把磁臂不断向一个方向移动(从外圈向内圈移动,或反之),不断处理这个方向上的下一个请求
- 直到这个方向上没有更多请求后,再改变磁盘移动方向重复上述过程
File organization
- 目标:将组织块的方式与访问数据的方式相对应,从而优化块的访问时间
- 例如把相关信息存储在同一个或相邻的柱面中
- 但随着数据的插入和删除,可能会导致空闲空间碎片化,导致新插入的数据被分散到各个位置,导致访问这些数据的时间变长
- 可以利用一些磁盘整理工具来把这些数据重新组织到一起
Nonvolatile write buffers(非易失性写缓冲区)
- 作用:通过把块写入非易失性 RAM 缓冲区来加速磁盘写入操作
- Non-volatile RAM: 由电池供电的 RAM 或闪存
- 即使断电后数据也能保留,在通电后把数据写入磁盘
- 在磁盘没有其他请求或者请求等待了一段时间后,控制器会把数据写回到磁盘中
Log disk(日志磁盘)
- 一个专门用于写入块的更新日志的磁盘
- 由于不需要寻道,写入速度非常快
- 也不需要特殊的硬件(如非易失性 RAM)
- 文件系统通常会对写磁盘操作进行重排列以提高性能
- 文件日志系统会确保数据以安全顺序写进非易失性 RAM 或日志磁盘中
- 如果没有使用日志,那么在系统崩溃后可能会导致数据不一致
RAID¶
RAID 0-6 的内容和计组笔记中关于 RAID 的内容是一致的,这里就不记了。
Choice of RAID Level
选择 RAID 级别时需要考虑以下几个方面:
- 成本
- 性能:每秒 I/O 操作的数量,以及进行正常操作时的带宽
- 故障期间性能
- 故障磁盘重建期间的性能:包括重建故障磁盘所需的时间
关于使用何种 RAID 级别
- RAID 0:仅在数据安全不那么重要时使用,例如可以从其他来源快速恢复数据
- RAID 2 and 4:被 RAID 3 和 5 上位替代了,不使用
- RAID 3:由于比特级条带化要求对单个块的读取都要访问所有的磁盘,因此性能较差(有不必要的磁臂移动),而块级条带化的 RAID 5 避免了这个问题,因此常选择 RAID 5
- RAID 6:由于 RAID 1 和 RAID 5 已经提供了几乎所有应用场景下足够的安全性,很少被考虑使用
因此被考虑使用的基本上只有 RAID 1 和 RAID 5。
- RAID 1 提供的写入性能比 RAID 5 更好
- RAID 5 再写入单个块时需要至少 2 次块读取和 2 次块写入的操作
- RAID 1 则只需要 2 次块写入操作
- RAID 1 的存储成本比 RAID 5 更大,
- RAID 1 需要 2 倍的存储空间来存储数据
- RAID 5 只需要 N+1 个磁盘来存储 N 个磁盘的数据
- 但由于磁盘技术的快速发展,单位数据存储成本已经大幅下降,因此选择使用 RAID 1 的情况也并不少见
Hardware Issues¶
- Software RAID: RAID 依赖于软件实现,不需要额外的硬件支持
- Hardware RAID: RAID 通过特殊的硬件实现
- Latent failures: 先前被成功写入的数据被损坏
- Data scrubbing(数据清理):持续检测潜在错误,并在发现错误后从副本/校验中恢复数据
- Hot swapping (热插拔): 在系统运行时就可更换磁盘,无需断电
- spare disks(备用磁盘): 在其他磁盘发生故障时自动接管其工作
Storage Access¶
数据库文件在逻辑上被划分为定长的存储单元,称为块(block)。块是数据存储分配和传输的基本单位。
- 主存会使用 buffer 来保存磁盘中的数据块,以此来加速数据的访问
- 数据库系统希望最小化磁盘与主存之间数据块的传输次数

缓冲池(buffer pool)是主存中用于保存磁盘块的区域
- 缓冲池中保存着磁盘页(disk page),即上图中黑色方块
- 来自于更高层次的访问请求会被转换为对缓冲池的访问请求
- 数据必须处在 RAM 中才能被 DBMS 操作
- 会维护一个内容为 < frame#, page_id > 组成的对的表格
Note
- Page: a unit of data
- Block: a unit of disk space
- Frame: a unit of buffer pool
in practice, block \(\approx\) page
Buffer Manager¶
应用程序在它们需要一个磁盘中的块时,会调用缓冲池管理器(buffer manager)
- 如果这个块已经在 buffer 中了,那么这个程序会得到这个块在主存中的地址
- 如果这个块不在 buffer 中,那么缓冲池管理器会把它从磁盘中读入到 buffer 中
- 缓冲池管理器会为这个新的块分配一个 frame
- 如果缓冲池已经满了,那么缓冲池管理器会选择一个块进行替换
- 选择的块会被写回到磁盘中(如果它被修改过)
- 然后把新的块读入到这个 frame 中
- 如果缓冲池中有空闲的 frame,那么就直接把新的块读入到这个 frame 中
- 最后返回这个块在主存中的地址
一些其他概念
- Pinned block(固定块): 被锁定在缓冲池中的块,不能被替换。例如这个块正在被使用,不能被替换。
- Toss-immediate strategy:当一个块被使用后,就立即把它从缓冲池中替换掉
- 有些缓冲池中的页面会被多个事务使用,我们需要使用一个固定计数(pin count)记录使用这个页的事务数量,当 pin count 为 0 时,才可以替换这个页面
Buffer-Replacement Policies¶
LRU strategy (Least Recently Used, 最近最少使用策略)
- 在重复扫描数据等访问模式中可能表现不佳
- 例如我们要不断循环扫描 5 个 block,但是 buffer 里只能装 4 个 block
- 这么一来刚刚被替换出去的 block 实际上就是我们马上就要用到的 block
MRU strategy (Most recently used, 最近最常用策略):
- 系统会固定正在处理的块,这个块处理完毕后就会被解锁(unpin),我们总是替换掉刚刚处理完的块
- 在特定的数据访问模式中有效
有时我们会使用一个混合的策略来替换块,把现有的替换策略与查询优化器提供的替换策略相结合。
File Organization¶
数据库被存储为文件的集合(collection)
- 每个文件都由一系列记录(record)组成
- 每个记录都由一系列字段(field)组成
- 记录有两种类型:fixed-length record 和 variable-length record
- fixed-length record: 每个字段的长度都是固定的,例如 4 字节
- variable-length record: 每个字段的长度都是可变的,例如字符串类型的字段
Fixed-Length Records¶
优势:一个很简单直观的存储方式
- 第 \(i\) 条记录从第 \(n \times (i-1)\) 个字节开始被存储,其中 \(n\) 是每条记录的长度
- 对记录的访问很简单,但记录可能会跨块存储
在删除记录 \(i\) 时有不同的处理方式:
- 把第 \(i+1,\ldots,n\) 条记录都向前移动一位到第 \(i,\ldots,n-1\) 条记录的位置上
- 把第 \(n\) 条记录移到第 \(i\) 条记录的位置上
- 不移动任何其他记录,使用 free list(空闲列表)来记录所有空闲的记录位置

Free list
- 在文件头保存第一个被删除的(空闲的)记录的地址(也还有其他的信息)
- 每一个空闲记录会记录下一个空闲记录的位置,从而形成一个列表
- 好处在于能够更高效地利用空间,而不需要移动其他记录
Variable-Length Records¶
文件中可能拥有多种不同类型的记录,因此需要使用不同的存储方式和不同的长度来存储这些记录
- 记录的各种属性按照顺序存储在一起
- 变长属性会使用固定大小来表示(offset,length),实际的数据会被保存在所有定长属性之后
- 空值(null value)会使用空值位图(null-value bitmap)来表示

比如上图中的 (21, 5) 表示从第 21 个字节开始存储记录,长度为 5 个字节
Slotted Page Structure¶

Info
slotted page 是数据库中页的常见组织形式
- 优点是可以存储可变长的 record
- 其核心是通过 slot 数组中存储的偏移值来查找 page 中的某个 record 具体内容是什么。即可以通过 page 号和 slot 号就可以查询磁盘上任意一个 record 的内容。
slotted page 主要由三个部分组成
- header
- slot array
- 存储在 page 中的各个 record
Slotted page header 包含各种元数据:
- 记录条目的数量
- block 中空闲空间的结束位置
- 每个 record 的位置和大小
slot array 中的每个 slot 都包含着两个关键信息:记录长度与指向记录的指针
Note
- 记录可以在 page 中移动,以保证记录之间没有空闲的空间(即页内没有碎片),在删除一个记录时会移动其他记录来保证这一性质
- 记录的索引不会直接指向记录本身,而是会指向 header 中这个 record entry 对应的 slot(间接指针,先访问对应的 slot,再通过 slot 中的偏移量来访问记录内容)
- 这样做的好处是当我们移动记录时,只需要更新对应 slot 中的偏移量,而不需要更新所有指向这个记录的指针
Organization of Records in Files¶
当我们新插入一个记录时,需要知道插入到哪里,怎么插入。
-
Heap file (堆文件, 流水文件): a record can be placed anywhere in the file where there is space
有足够的空间就直接插入
-
Sequential file (顺序文件): store records in sequential order, based on the value of a search key of each record
对所有的记录维护一个次序,按照次序插入新记录
-
Hashing file (散列文件): a hash function computed on some attribute of each record; the result specifies in which block of the file the record should be placed
根据记录内容计算哈希值,然后找到对应的位置插入
-
Clustering file organization (聚集文件组织): records of several different relations can be stored in the same file
动机来自于把相关的记录保存在同一个块中,以最小化 I/O 操作
Sequential File Organization¶
适用于需要对整个文件进行顺序处理的应用程序,文件中的记录会按照搜索键(search key)排序。
- Deletion: use pointer chains
- Insertion: locate the position where the record is to be inserted
- 如果有空闲位置,就把新数据插入到那里
- 如果没有,那么就把新记录插入到 overflow block 中
- 两种情况都需要更新 pointer chain
- 需要定期对文件进行重新排序来保持次序

Multitable Clustering File Organization¶
Store several relations in one file using a multitable clustering file organization
Example
例如对于“老师”和“部门”这两个常常一起访问的 table,我们可以把它们放在一起。但这么做的缺点在于,如果我们只想要访问它们其中之一,就必须把整个文件都读入到内存中,造成不必要的 I/O 操作。
Data-Dictionary Storage¶
Data dictionary (also called system catalog) stores metadata:
元数据(matadata)也是数据,它记录了整个数据库的结构、内容、存储方式等信息,我们也要把它们保存下来
- Information about relations
- User and accounting information, including passwords
- Statistical and descriptive data
- Physical file organization information
- Information about indices
