Open winterggg opened 6 months ago
论文名称:SQLite: past, present, and future
作者单位:威斯康星大学麦迪逊分校 (University of Wisconsin-Madison)的三名研究人员和 Sqlite 社区的三名贡献者
发表期刊:VLDB Endowment(数据库领域三大顶会之一),01 August 2022
这篇论文 novelty 比较一般,主要跑了几个 benchmark 然后基于测试场景提出了一个奇奇怪怪的优化方法. 但对 SQLite 的一些介绍和分析比较全面,因此也是比较值得阅读的.
SQLite自2000年首次发布以来,已成为最广泛部署的数据库引擎之一,存在于几乎所有智能手机、计算机、网络浏览器、电视和汽车中.
它的普及归功于其跨平台,自包含和极小的 release 体积,可靠和快速.
如图,SQLite 使用了模块化的设计. 它的架构包括SQL编译器模块、核心模块、后端模块和一些辅助模块,如测试代码和实用工具.
B树
SQLite 数据库文件本质上是B树的集合. 分为两种:表B树和索引B树
数据库表的表示
rowid
INTEGER PRIMARY KEY
WITHOUT ROWID
页缓存(Page Cache)
操作系统接口
值提取
CREATE TABLE t (a, b, c);
事务性数据库引擎
回滚模式(Rollback Mode)
预写日志模式(Write-Ahead Log Mode, WAL)
WAL模式的优势
WAL模式的劣势
作者这里举了个例子,说现在的科研人员其实都有这样一个广泛的需求,就是在上线大模型前在本地 in-process 的快速跑一些 OLAP 查询,比如比较常见的就是用 pandas 跑一些数据分析任务,但这些库的效率其实是很低的,作者认为 sqlite 这种嵌入式数据引擎在这方面未来大有可为.
这一部分主要是一些基准测试,图表比较多也有些无聊,这里摘一些主要结论.
作者开启编译时选项 VDBE_PROFILE 输出了 VDBE 执行每个字节码指令所消耗的 CPU 周期数. 发现只有两个指令(SeekRowid和Column)占了大多数 CPU 周期:
然后分别水了下优化方法:
就是测试下二进制文件存储,和 fread/fdatasync 还有 duckdb 测试,感觉比较迷我直接跳了.
论文笔记 SQLite: Past, Present, and Future
论文名称:SQLite: past, present, and future
作者单位:威斯康星大学麦迪逊分校 (University of Wisconsin-Madison)的三名研究人员和 Sqlite 社区的三名贡献者
发表期刊:VLDB Endowment(数据库领域三大顶会之一),01 August 2022
TL; DR
这篇论文 novelty 比较一般,主要跑了几个 benchmark 然后基于测试场景提出了一个奇奇怪怪的优化方法. 但对 SQLite 的一些介绍和分析比较全面,因此也是比较值得阅读的.
历史与架构
历史
SQLite自2000年首次发布以来,已成为最广泛部署的数据库引擎之一,存在于几乎所有智能手机、计算机、网络浏览器、电视和汽车中.
它的普及归功于其跨平台,自包含和极小的 release 体积,可靠和快速.
引擎架构
模块
如图,SQLite 使用了模块化的设计. 它的架构包括SQL编译器模块、核心模块、后端模块和一些辅助模块,如测试代码和实用工具.
backend 细节
B树
SQLite 数据库文件本质上是B树的集合. 分为两种:表B树和索引B树
数据库表的表示
rowid
列.INTEGER PRIMARY KEY
表,主键列取代rowid
成为B树的键.WITHOUT ROWID
的表是特殊情况:WITHOUT ROWID
表的B树键由主键列组成,然后是表的所有剩余列.INTEGER PRIMARY KEY
表的情况.页缓存(Page Cache)
操作系统接口
值提取
CREATE TABLE t (a, b, c);
.事务
事务性数据库引擎
回滚模式(Rollback Mode)
预写日志模式(Write-Ahead Log Mode, WAL)
WAL模式的优势
WAL模式的劣势
运行硬件和工作负载的演变
作者这里举了个例子,说现在的科研人员其实都有这样一个广泛的需求,就是在上线大模型前在本地 in-process 的快速跑一些 OLAP 查询,比如比较常见的就是用 pandas 跑一些数据分析任务,但这些库的效率其实是很低的,作者认为 sqlite 这种嵌入式数据引擎在这方面未来大有可为.
性能测试和优化
这一部分主要是一些基准测试,图表比较多也有些无聊,这里摘一些主要结论.
TATP 吞吐测试(OLTP 领域)
SSB 吞吐测试(OLAP)
进一步优化
作者开启编译时选项 VDBE_PROFILE 输出了 VDBE 执行每个字节码指令所消耗的 CPU 周期数. 发现只有两个指令(SeekRowid和Column)占了大多数 CPU 周期:
然后分别水了下优化方法:
Blob 测试
就是测试下二进制文件存储,和 fread/fdatasync 还有 duckdb 测试,感觉比较迷我直接跳了.
一些有意思的信息