winterggg / blog

0 stars 0 forks source link

论文笔记 SQLite: Past, Present, and Future #9

Open winterggg opened 6 months ago

winterggg commented 6 months ago

论文笔记 SQLite: Past, Present, and Future

TL; DR

这篇论文 novelty 比较一般,主要跑了几个 benchmark 然后基于测试场景提出了一个奇奇怪怪的优化方法. 但对 SQLite 的一些介绍和分析比较全面,因此也是比较值得阅读的.

历史与架构

历史

SQLite自2000年首次发布以来,已成为最广泛部署的数据库引擎之一,存在于几乎所有智能手机、计算机、网络浏览器、电视和汽车中.

它的普及归功于其跨平台,自包含和极小的 release 体积,可靠和快速.

引擎架构

模块

image-20240331192521985

如图,SQLite 使用了模块化的设计. 它的架构包括SQL编译器模块、核心模块、后端模块和一些辅助模块,如测试代码和实用工具.

image-20240331193253026

backend 细节

B树

SQLite 数据库文件本质上是B树的集合. 分为两种:表B树和索引B树

数据库表的表示

页缓存(Page Cache)

操作系统接口

值提取

事务

事务性数据库引擎

回滚模式(Rollback Mode)

预写日志模式(Write-Ahead Log Mode, WAL)

WAL模式的优势

  1. 增加并发性:读取者可以在写入者将更改提交到WAL时继续操作数据库.
  2. 速度:通常更快,因为它需要较少的落盘操作,且写入操作更加顺序. (大概就是 commit 前可以享受内存的性能或者说追加写的性能)

WAL模式的劣势

运行硬件和工作负载的演变

作者这里举了个例子,说现在的科研人员其实都有这样一个广泛的需求,就是在上线大模型前在本地 in-process 的快速跑一些 OLAP 查询,比如比较常见的就是用 pandas 跑一些数据分析任务,但这些库的效率其实是很低的,作者认为 sqlite 这种嵌入式数据引擎在这方面未来大有可为.

性能测试和优化

这一部分主要是一些基准测试,图表比较多也有些无聊,这里摘一些主要结论.

TATP 吞吐测试(OLTP 领域)

SSB 吞吐测试(OLAP)

进一步优化

作者开启编译时选项 VDBE_PROFILE 输出了 VDBE 执行每个字节码指令所消耗的 CPU 周期数. 发现只有两个指令(SeekRowid和Column)占了大多数 CPU 周期:

然后分别水了下优化方法:

Blob 测试

就是测试下二进制文件存储,和 fread/fdatasync 还有 duckdb 测试,感觉比较迷我直接跳了.

一些有意思的信息

  1. 最初作为Tcl编程语言的扩展打包,SQLite诞生于对在另一个独立进程中运行的数据库服务器进行调试时的沮丧之情.
  2. 据估计,目前可能有超过一万亿个正在使用的SQLite数据库. 据估计,SQLite是最广泛部署的软件库之一.
  3. SQLite 是一个真正的工业级别数据库:SQLite 代码是一个 15 万行的单个 C 语言,但测试代码和脚本居然有九千多万行. 每行SQLite代码中有超过600行的测试代码. 测试覆盖库中100%的分支. 测试套件非常多样化,包括模糊测试、边界值测试、回归测试以及模拟操作系统崩溃、断电、I/O错误和内存不足等各种情况的测试.
  4. 由于 SQLite 的变态测试覆盖率,给 SQLite 添加功能变得非常惬意,不用太担心对现有功能造成影响.
  5. 删除操作比其他语句更加耗费资源,平均每个语句约为4毫秒.
  6. 对于排序大量数据,SQLite使用可选的多线程外部合并排序算法.
  7. 测试技巧:测试前可以用 SELECT * query populate 以下 buffer pool 以及 测试前可以先预热几秒钟再统计.
  8. sqlite 文件格式是美国国会图书馆推荐的数字内容保存格式.
  9. SQLite也有广泛的文档和注释,这有助于新开发人员快速理解SQLite的架构.