0%
存储结构
- 磁头浮在盘片上不接触盘片(否则会出现盘片损坏)
- remapping of bad sectors, 若出现坏块且尝试写这个坏块时,可以重映射到别的物理块。
- 性能指标: I/O operations per second(IPOS), mean time to failure(MTTF)
- FLASH: NOR FLASH、NAND FLASH
- SSD are built using NAND flash
- physical page需要定期擦除
- hot data & cold data
- flash translation layer
- flash支持I/O并行请求
- Hybird disk drives: 在磁盘中使用SSD作为cache缓存数据
- 数据库被映射到一些操作系统管理的文件中。
- 大多数db默认使用4到8k的block大小
- 一个block中可能包含多个records
- 要求records完整地包含在一个block中(即不能即包含在一个block又包含在另一个block中),这样能加快访问数据的速度
Fixed-Length Records
- 可以将最后插入的record放入被删除的record的位置,而不是整体移动插在最后(这样会移动很多次)
- 在文件起始位置分配一定数量的file header, 可以记录第一个被删除record的地址,然后第一个被删除的record位置又记录着第二个被删除的record的位置。这样就形成了
free list
- 当插入records时,找到free list的最后一个位置将record插入
Variable-Length Records
- page layout:slotted-pages, log-structured
- varchar类型<偏移量,长度>
- 变长记录的空位图记录哪一个属性是空值
- 分槽的页结构,块头记录条目的个数,块中空闲空间的末尾处, 即尾部的开始处(方便插入),包含记录位置和大小的记录条目组成的数组
other
- 如果数据库的页超过操作系统的标准页(4KB)DBMS将需要利用额外的手段来确保数据页原子写(在系统出现崩溃的时候)
- 如果两个表相关,DBMS会’pre-join’这样可以使得两个表在同一个页上,效率更高
Log-Structure Storage
- slotted-pages的一些缺点: Fragmentation、Unless Disk I/O、Random Disk I/O
- 每一个log record包含一个独立的标识符
- DB可以将log压缩到一个表中,称为SSTable(Sorted String Table)
- write amplification: 不断写同样的数据
Data Representation
- 在tuple中的数据本质上是字节数组,DBMS将这些字节数组解释为什么属性取决于
数据的表示
- 五种高级数据类型: integers, variable-precision numbers, fixed-point precision numbers, variable length values, and date/times.
- 整型数(INTEGER, BIGINT, SMALLINT, TINYINT)
- 可变精度数字(FLOAT, REAL)
- 定点精度数字(NUMERIC, DECIMAL)
- 可变长度值(VARCHAR, VARBINARY, TEXT, BLOB)。
- 比较典型的是存在头部储一个跟踪长度的属性,方便跳到下一个值;其中可能也包括校验和
- 大多数DBMS不允许tuple的大小超过一个页,因此当tuple过大时,数据会存储在”overflow pages”中,并且tuple中会有到overflow pages的引用。
- 一些系统也会允许将数据存储在外部文件上,但DBMS不能操纵这些数据,同时这些数据也不具有持久性和事务保护。
- 日期和时间(TIME, DATE, TIMESTAMP)
- System catalogs
- 为了解析tuple的内容,DBMS维护了一个内部目录来说明数据库的元数据。这些元数据包括表中的哪一列的类型和值是什么等信息。
Database Workloads
- OLTP(Online Transaction Processing)。OLTP一般处理更多的写相比于读
- OLAP(Online Analytical Processing)。分析现有的数据并产生新的数据
Storage Models
- N-Ary Storage Model(NSM)。对于一个tuple的所有属性都在一个页里,适配OLTP
- 优点:更快地插入,更新,删除;对需要整个tuple的查询有利
- 缺点:不利于扫描表的大部分或者属性的子集
- Decomposition Storage Model(DSM)。就是所谓的列存储,将一个属性列存储在一个块中,所有块连续存放。适配OLAP
- 优点:减少大量的I/O,因为DBMS在查询中只读数据;更好的查询处理和数据压缩
- 缺点:点查询,插入,更新和删除变慢,因为tuple中的属性分离
- 将属性列还原成原来的行存储有两种方法:
- 每一列有同样的长度和offset
- 使用嵌入的tuple ids(如主键)。但这种方法会造成大量的存储开销
Database Compression
- 压缩可以提高性能,尤其是对于那些只读的分析负载
- 压缩和解压也需要开销
- 如果数据集是完全的随机bit,将不能压缩
- 压缩策略:
- 必须产生固定长度的值,唯一的例外,可变长度数据存储在分离的pools里
- 允许DBMS在查询执行过程中推迟解压
- 必须是无损的策略,任何有损的压缩将在应用级执行
- 压缩粒度:
- Block Level: 压缩同一个表中的元组块
- Tuple Level: 压缩整个tuples的内容(仅支持NSM)
- Attribute Level: 压缩一个tuple的一个属性值,也可以针对同一个tuple的多个属性
- Columnar Level: 压缩多个tuples中的多个属性值(仅支持DSM)
Memory Management
- Spacial Control: 页被写到磁盘的哪个位置,应该保证页在磁盘尽可能物理上地紧挨着
- Temporal Control: 合适将页读到内存中,何时将页写到磁盘中,目标是为了减少从磁盘读页造成的停顿
- Locks vs. Latches: lock是高级原语用于保证的数据库内容(e.g. tuples, databases, tables)不受其他事务的影响;latch是低级原语,用于内部数据结构(e.g., hash tables, regions of memory)的临界区
- Buffer Pool是磁盘页在内存中的缓存
- 元数据: page table(类似于os的page table),注意与page directory的区别,page directory映射页id到数据库文件中的页的位置,对page directory的所有改变都必须记录在磁盘上,以便DBMS重启时能找到。page table的每一页还可能包含:脏位,pin计数等元数据
- 内存分配策略:全局(对于整个工作负载有利)和局部(对于单个查询或事务有利)策略。tradeoff,大多数系统一般组合它们使用
- 优化:pre-fetching