2022年 Sqlite白皮书对比DuckDB差异 -- 什么叫做关公战秦琼
❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
其实之前我写关于SQLite的知识,我并未理解一堆人在我的评论区,提出为为什么不用duckdb,我对duckdb的认知应该是OLAP的数据库系统,和移动端有关系我实在没有明白,直到我读了Kevin P. Gaffney、Martin Prammer、Larry Brasfield、D. Richard Hipp、Dan Kennedy 和 Jignesh M. Patel 共同撰写《SQLite:过去、现在和未来》,这本资料是刊发在PVLDB 2022年第十二期上的论文。
熟悉SQLite的应该知道这几位是SQLite的奠基者,中文术语老祖级别的。在他们的这个白皮书里面有写到DUCKDB,相关白皮书已经在9个群里发了。
论文背景与核心议题
SQLite的地位与设计 SQLite自最初发布以来的二十年间,已成为 部署最广泛的数据库引擎。如今,它几乎存在于每一部智能手机、计算机、网络浏览器、电视和汽车中。其普及的原因包括其 进程内(in-process)设计、独立的代码库、广泛的测试套件 和 跨平台文件格式。
SQLite最初是作为Tcl编程语言的扩展于2000年8月发布的,起源于作者对调试在单独进程中运行的数据库服务器的挫败感。与通常占据专用进程并使用共享内存与应用程序通信的客户端-服务器数据库系统不同,SQLite 嵌入在宿主应用程序的进程中。
SQLite采用模块化设计,主要由四组模块组成:核心模块、SQL编译器模块、后端模块和附件模块。
SQL编译器模块:将SQL语句翻译成 字节码程序,由 Tokenize(词法分析器)、Parser(解析器) 和 Code Generator(代码生成器) 组成。
核心模块:虚拟机(VDBE) 是SQLite的核心,负责执行代码生成器生成的字节码程序的逻辑。
后端模块:包括 B-树模块(SQLite文件本质上是B-树的集合)、Page Cache(页缓存) 和 OS Interface(操作系统接口),后者通过虚拟文件系统(VFS)实现跨操作系统移植性。
事务模式
SQLite提供ACID保证(原子性、一致性、隔离性、持久性),主要通过两种模式实现:
回滚模式(Rollback mode):通过创建回滚日志文件来记录修改前的页面内容,并在提交时获取排他锁并将修改后的页面刷新到数据库文件和稳定存储。
预写式日志模式(WAL mode):将原始页面保留在数据库文件中,并将修改后的页面附加到单独的WAL文件(Write-Ahead Log)。WAL模式的优势在于 提高了并发性(读者可以在写入者提交时继续操作)和 速度更快(写入稳定存储次数较少,且写入更具顺序性)。但是,WAL模式需要共享内存,因此 不能在网络文件系统上使用。
OLTP 性能 (TATP)
在OLTP基准测试TATP中,SQLite-WAL产生了最高的吞吐量,优势显著。
在云服务器上,SQLite-WAL的吞吐量达到 10,000 TPS,比DuckDB快 10 到 500 倍不等。
SQLite-WAL和SQLite-DELETE的性能通常与数据库大小无关,而DuckDB则受到数据库大小的不利影响。
这些结果符合预期,因为SQLite的事务处理机制经过多年精细调整,而DuckDB主要为OLAP和ETL设计。
OLAP 性能 (SSB)
在OLAP基准测试SSB中,DuckDB明显快于SQLite。
性能差距最宽时,DuckDB快 30-50 倍;最窄时,DuckDB快 3-8 倍。
性能瓶颈识别与优化
通过对SQLite执行引擎的性能分析(VDBE_PROFILE选项),作者发现了两个关键瓶颈指令:
SeekRowid:用于在B-树索引中查找给定行ID的行(连接操作的一部分)。
Column:用于从给定记录中提取列值。
优化目标一:避免不必要的B-树探测 (SeekRowid)
SQLite使用嵌套循环来计算连接(Join),并使用主键索引或临时索引加速内层循环。在SSB查询中,SQLite对外层表(例如lineorder)的每个元组都会探测内层表(例如part、date、supplier)的主键索引,但其中很大一部分元组最终会被过滤掉。
作者决定整合 布隆过滤器(Bloom filters) 来实现 预读信息传递(Lookahead Information Passing, LIP)。
LIP通过在连接处理开始前在所有内部(维度)表上创建布隆过滤器,并在执行连接前探测这些过滤器,从而 显著减少了流经连接管道的元组数量,减少了不必要的B-树探测。
优化结果:在Raspberry Pi上,SQLite在SSB上整体加速 4.2倍。在云服务器上,整体加速 2.7倍。性能分析图显示,SeekRowid指令消耗的CPU周期显著减少。
优化目标二:简化值提取 (Column)
SQLite使用 灵活类型(flexible typing),这意味着每个值都带有类型信息,存储在记录的头部。
为了提取一个值,SQLite必须遍历头部中的每个序列类型代码,以计算出目标值在记录体中的偏移量。这与列式数据库中连续的列值存储方式形成对比。
作者探索了替代方案,但由于 SQLite数据库文件格式的稳定性、跨平台性和向后兼容性 是其核心优势(该格式是美国国会图书馆推荐的数字内容保存格式之一),任何对数据格式的重大改变(例如切换到列式存储)都会牺牲这些特性,因此作者 没有进行文件格式的更改。
Blob 数据操作 (BLOB Benchmark)
许多应用程序使用SQLite作为 blob数据存储,因为它提供了比文件系统更强的事务性保证(ACID)。
对于 100 KB 的Blob数据,SQLite-WAL的吞吐量最高,在云服务器上甚至略高于文件系统(可能是因为SQLite的缓存能力)。
对于 10 MB 的大Blob数据,DuckDB的吞吐量最高。由于10 MB超过了WAL的默认限制(约4 MB),SQLite-WAL的单次写入会触发立即检查点(checkpoint),导致两次写入操作,降低了其性能。
对于嵌入式数据库引擎而言,资源占用是一个重要考量。
编译体积和时间:SQLite的库文件非常小,优化尺寸后仅 900 KB,编译时间仅 15 秒。相比之下,DuckDB的编译时间需要 5-10 分钟,库文件大小为 32-37 MB。
存储空间:尽管SQLite库体积小,但由于其行式存储和灵活类型系统,它存储相同数据集所需的空间比DuckDB要大(例如,存储SSB数据集,SQLite比DuckDB多占用 60% 的空间)。DuckDB使用列式存储,并对数据进行高效表示和压缩。
CSV数据加载速度:有趣的是,SQLite在从CSV文件加载SSB数据集时比DuckDB快近 20%
架构和内部机制差异
数据类型处理:
SQLite 使用 灵活类型 (Flexible Typing),类型信息与 每个值 关联,存储在记录的头部。
DuckDB 将类型信息与 整个列 关联,从而简化了值提取过程。
跨平台与文件格式:
SQLite 的数据库文件格式 极其稳定、跨平台,并具备 向后兼容性,是美国国会图书馆推荐的数字内容保存格式之一。作者强调,不愿意牺牲 数据库文件格式的稳定性和可移植性来换取性能,因此未改变其行式存储格式。
DuckDB 也使用单文件数据库和自包含代码,但在架构上更激进地采用了列式存储。
总结 SQLite 的优势在于其 无与伦比的普及性、可靠性、极小的体积 和 强大的 OLTP 性能。DuckDB 则以其专为 OLAP 优化的架构、列式存储和向量化执行,在分析工作负载上展示出卓越的速度。
和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
OceanBase Hybrid search 能力测试,平换MySQL的好选择
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究
OceanBase 6大学习法--OBCA视频学习总结第六章
OceanBase 6大学习法--OBCA视频学习总结第五章--索引与表设计
OceanBase 6大学习法--OBCA视频学习总结第五章--开发与库表设计
OceanBase 6大学习法--OBCA视频学习总结第四章 --数据库安装
OceanBase 6大学习法--OBCA视频学习总结第三章--数据库引擎
OceanBase 架构学习--OB上手视频学习总结第二章 (OBCA)
OceanBase 6大学习法--OB上手视频学习总结第一章
没有谁是垮掉的一代--记 第四届 OceanBase 数据库大赛
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
OceanBase 学习记录-- 建立MySQL租户,像用MySQL一样使用OB
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 新版本就一定好--由培训现象让我做的实验
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
MySQL相关文章
一篇为MySQL用户,分析版本核心差异的文章--8.028-8.4的差异
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师