PostgreSQL
列存增加更新和删除功能
Hydra 是企业级数据仓库的开源替代品。速度快且功能丰富,开发人员可以更快的构建更好的分析。支持列存PG的更新和删除是#1客户功能请求,现在GA了。之前博文“如何为分析构建最快的PG数据库”中,回顾了Hydra团队如何将 列存、向量化和查询并行化 添加到PG中,以及使用ClickBench的基准测试结果。目前对 WHERE进行了向量化 。 但未用SIMD,声称很快会提供 。平均下来, 查询性能比基本PG提高了23倍 !这也太夸张了吧,可以弄下来测试下,文末有源码地址。
如何工作
更新和删除是关系型数据库中一些最常见的功能。虽然append-only存储对不可变数据很有用,但缺乏其他数据库任务所需的灵活性。PG中的更新和删除并不是物理删除,而是在heap存储的tuple header中标记删除。
Hydra实现
列存储功能依赖于columnar schema中的几个元数据表。例如 columnar.stripe 表包含事务当前可见的所有stripes,这些信息用来读取和定位列存表的stripes。
Heap表通过MVCC在并发环境中提供数据的一致性版本。每个SQL语句可以看到一段时间之前的快照数据,而不管底层数据的当前状态如何。您可以想象当两个并发事务处于活动状态时的情况 - A 和 B。如果事务 A 向表中添加行,那么另一个事务将无法看到它们,因为事务 B 中的条目将不可见,即使columnar.stripe它们对事务 A 可见。
每个stripe包含15个chunk,每个chunk最多包含10,000行,每个chunk的元数据存储在columnar.chunk 。该表可以 根据chunk的最小值和最大值过滤chunk 。每个chunk列在该表都有记录,因此执行过滤(WHERE)时,将根据最小值和最大值在读取chunk前检查这些值。
由于Hydra列存最初不可变,仅能追加,需要一些方法来标记列存外更新和删除的行。为此,添加了一个columnar.row_mask堆表来检查是否应跳过一行,从而模拟DML功能。
表的定义columnar.row_mask:
CREATE TABLE row_mask (
id BIGINT NOT NULL,
storage_id BIGINT NOT NULL,
start_row_number BIGINT NOT NULL,
end_row_number BIGINT NOT NULL,
mask BYTEA,