2023-05-08 数据库-流水操作与物化-分析

本文探讨了数据库查询的火山模型和物化模型。火山模型是一种流水线操作,常见于MySQL,以迭代器方式传递数据,但高磁盘IO和对CPU缓存不友好。相比之下,物化模型如MonetDB,利用现代CPU特性,通过全量操作减少磁盘IO,内存中的物化有助于控制数据交换。列存数据库如DuckDB结合了两者优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:

数据库的查询模型比较经典的是火山模型, 其实就是流水线操作, 例如mysql.

作为对应的便是物化模型, 例如monetdb.

列存数据库自从monetdb的开创性paper开始, 几乎都是采用了物化模型. 并且一定程度上结合了流水线操作, 例如duckdb.

本文做些简要的分析.

流水线操作/火山模型:

  1. 更为常见的名字是所谓的火山模型
  2. 比较典型的特征就是在每一个操作符或者说算子中以迭代器的方式传递数据
  3. 在函数实现上便是以next为操作核心, 可以参考mysql的sub_select函数的实现
  4. 由于操作符是逐个元组的传递并计算, 内存的使用从而可以保持在单个元组以及投影的结果集相关
  5. 由于并非是以磁盘块来进行读取, 而是以元组为基础, 导致更高次数的磁盘IO
  6. 流水线操作对cpu的cache和pipeline不友好, 每个操作符的迭代器存在分支判断和分支预测, 导致cache和pipeline分支预测失效, 这也是被montedb极为抨击的点, 并以此导致monetdb采取了全量物化模型
  7. 往好处看, 由于操作符的处理都被流水线化, 所以便于进行不同操作符的并行执行, 这点上可以参考duckdb
  8. 在经典的流水线操作中, 一些操作符的物理策略也会采取物化模型, 典型的就是mysql的hash join策略

物化模型:

  1. 比较经典的是monetdb的paper中的思想  https://www.cidrdb.org/cidr2005/papers/P19.pdf
  2. 理论基础是现代CPU的多核特性, cpu cache, cpu pipeline预处理
  3. 可以说现在的列存储引擎都依据此思想来做
  4. 典型的特点便是对每个操作符都执行全量操作, 对于列存更有意思, 生成一个全新的列, 这点上可以参考monetdb的BAT, 以及clickhouse对于列的传递
  5. 由于执行全量操作占用的内存与该操作符以及表的数据量相关, 所以为了减少对内存的占用, 避免磁盘IO的颠簸, 将物化与流水线操作集合, 以控制内存和磁盘的数据交换频率
  6. 物化这个名字容易让人误解为是将中间结果持久化到磁盘, 但是更多的是在内存中进行物化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值