内容提要
Supabase 宣布 OrioleDB 存储引擎进入公测,所有套餐可用,计费与标准 Postgres 相同,但暂不适合生产环境。OrioleDB 以撤销日志替代死元组,采用 64 位事务 ID、索引组织表和免缓冲映射,减少表膨胀与高并发开销。基准测试显示,数据超出内存时其吞吐/美元表现最佳,8XL 配置约快 1.8 倍。适合频繁更新删除、大数据集和主键查询场景。
延伸解读
适用场景与性能边界
OrioleDB 的优势集中在频繁更新删除的表、数据量超出内存、高并发读写以及主键查询为主的场景。基准测试显示,数据超出内存时其吞吐/美元在所有测试规格中最高,8XL 配置约快 1.8 倍;但数据完全放入内存时差距缩小,Small 规格甚至落后于默认堆存储。读多写少且内存充足的工作负载收益有限,依赖非 B-tree 索引(如 pgvector HNSW)的场景目前也难见提升。
公测阶段的关键限制
OrioleDB 公测暂不适合生产环境,且没有 SLA。它只能在创建项目时选择,之后无法添加或移除;不支持时间点恢复(PITR),也不能将备份恢复到新项目。CLUSTER、VACUUM FULL 等命令在 OrioleDB 表上不可用,镜像不包含 plv8、plls、plcoffee 和 timescaledb-apache 等扩展。SERIALIZABLE 事务默认会对每个涉及的表加锁,可通过 orioledb.serializable 调整。自托管栈尚未集成 OrioleDB。
与默认堆存储的机制差异
默认 Postgres 堆存储中,更新会写入新行版本并留下死元组,所有索引通常需新增条目,autovacuum 跟不上时产生膨胀。OrioleDB 改用撤销日志回收旧版本,多数情况下表不积累死元组;采用 64 位事务 ID 避免回卷;索引组织表让主键查询只读一个结构,二级索引指向主键,更新仅写入列变化的索引;免缓冲映射减少共享缓冲区争用,写时复制检查点和行级 WAL 降低写密集负载的磁盘 I/O。
Q&A
OrioleDB 现在可以在 Supabase 上使用了吗?
是的,OrioleDB 存储引擎已在 Supabase 所有套餐上进入公测,创建项目时可以选择。计费与标准 Postgres 相同,支持计算和磁盘调整、只读副本、Postgres 升级和定时备份,但暂不适合生产环境。
Postgres 默认存储引擎有什么问题?
默认的堆存储引擎在更新时不会原地修改行,而是写入新版本并留下死元组,导致所有索引都需要新条目。删除也会产生死元组。VACUUM 和 autovacuum 清理可能跟不上,造成表膨胀和查询变慢。高并发下,主键查找需读索引和表,共享缓冲池竞争激烈,写密集负载产生大量磁盘 I/O。
OrioleDB 是如何解决表膨胀问题的?
OrioleDB 用撤销日志替代死元组:更新或删除时,将旧版本写入自动回收的撤销日志,因此表通常不会积累死元组,无需 VACUUM 清理。此外,它使用 64 位事务 ID 避免回卷,采用索引组织表减少索引更新,并实现免缓冲映射降低竞争。
OrioleDB 的性能提升有多大?
基准测试显示,当数据超出内存时,OrioleDB 在所有测试的计算规格上每美元吞吐量最高。在 8XL 实例上,它比堆存储的 Supabase Postgres 快约 1.8 倍,达到每分钟 113,850 笔事务。数据能放入内存时差距较小,Large 规格快约 13%,8XL 快约 29%,但 Small 规格堆存储反而领先。
哪些场景适合使用 OrioleDB?
OrioleDB 最适合频繁更新或删除的表,如订单状态、库存计数、任务队列和会话数据,因为这些表容易产生膨胀。它也适合数据集大于内存、大实例上高并发读写、以及大多数查询通过主键查找行的场景。读多写少且数据完全在内存中的工作负载差异较小。
在 Supabase 上如何创建使用 OrioleDB 的项目?
在 Dashboard 中新建项目,展开 Advanced Configuration,在 Postgres Type 下选择“Postgres with OrioleDB”,然后完成创建。项目中的新表默认使用 OrioleDB,无需特殊语法。本地开发可使用 Supabase CLI(v2.119.0 或更高版本)运行 `supabase init --use-orioledb` 初始化项目。
OrioleDB 公测期间有哪些限制?
公测版不适合生产环境,无 SLA。只能在创建项目时选择,无法后续添加或移除。不支持时间点恢复和将备份恢复到新项目。原生 B-tree 索引性能最佳,其他索引类型(如 pgvector HNSW)通过实验性桥接运行。CLUSTER、VACUUM FULL 等命令不可用。镜像不包含 plv8、plls、plcoffee 和 timescaledb-apache 扩展。SERIALIZABLE 事务默认对每个涉及的表加锁,可通过 orioledb.serializable 设置调整。项目不能同时使用 OrioleDB 和 Multigres。自托管 Supabase 暂不支持 OrioleDB。