在当今数字化浪潮中,数据的实时处理能力成为企业竞争的关键。随着软硬件结合技术的快速发展,数据库云原生能力的逐步成熟,以及DuckDB等现代嵌入式分析型数据库的迅速崛起,数据库HTAP理念和实践走向一个全新转折点,即:TP 和 AP 不再是割裂的应用场景,而是互相渗透,已经不再是技术选型上的取舍,而变成日常的调优手段。
本文介绍阿里云瑶池旗下的云原生数据库PolarDB PostgreSQL版(以下简称PolarDB-PG)HTAP建设思路,涉及PolarDB IMCI列存索引(In-Memory Column Index,简称IMCI)的适用场景、技术原理、功能形态、核心优势以及深度融合DuckDB的技术路线,并结合地平线自驾标签数据分析挖掘场景,分析IMCI在真实生产业务中的价值体现。
PolarDB-PG的HTAP实践思路
从本质上来说,HTAP在实现上一般是将行存与列存融合,从而分别应对 TP 和 AP 的需求。但大部分数据库实践 HTAP 理念时,由于自身产品的定位、研发目标的约束,导致这两类功能比较割裂,客户在使用时往往还是 TP 系统和 AP 系统分开建设。
随着云原生数据库对软硬件的深度优化,PolarDB 单一数据库实例的能力和扩展性大大提高,其存储早已突破数百TB,计算节点可达上千核。除了传统的在线业务外,越来越多的客户使用 PolarDB-PG 来承载大规模数据业务,在一个库内即可覆盖在线业务、历史数据存储、数据价值挖掘的全链路场景。
同时,近几年随着 DuckDB 等轻量化分析型数据库的崛起,其完备的向量化执行引擎可以在相同的计算资源下将性能提升 1~2 个数量级,也越来越多地为开发者所采用。
基于上述情况,PolarDB-PG 选择列存索引(IMCI)形式来实践 HTAP ,同时选用了 DuckDB 的向量化执行引擎并基于 PolarDB 云原生架构改进了列存结构,实现了PolarDB云原生化TP核心优势和DuckDB在卓越分析查询性能上的双剑合璧。
列存索引形式使得客户可以在现有的实例中原地开启该功能,只需要为表中的列创建列存索引(如下图所示),即可实现对复杂查询的加速。索引形式还可以进一步延伸适配向量、时空、图等多模数据类型,加速与AI的融合计算。TP 和 AP 不再是割裂的应用场景,两者互相渗透,对于 PolarDB-PG 而言,分析型 SQL 只需要日常的索引调优手段即可加速,大幅简化应用架构。
PolarDB-PG IMCI的使用场景与优势
PolarDB-PG IMCI当前支持两种开启方式,一种是添加独立的列存只读节点,一种是在现有的节点中直接使用预安装的IMCI插件。列存只读节点能够充分利用所在节点内存资源,同时使TP(事务)与AP(分析)业务在不同节点上相互隔离,互不影响。
PolarDB-PG IMCI主要适用以下场景:
- HTAP混合负载:实时交易与复杂分析并行,无需额外系统支撑,如:实时交易统计+报表生成。
- 复杂查询加速:慢SQL治理场景,全表统计、多列分组/排序,结合多表JOIN、多条件过滤等。
- ETL加速计算:基于IMCI强大而灵活的计算能力,直接在PolarDB中完成数据清洗、转换与聚合。
- 数据仓库场景:基于列存表实现AP分析、大宽表无固定索引查询/分析加速、以及多模数据的查询加速。
使用PolarDB-PG IMCI所带来的核心优势包括:
- 查询性能跃升:相比于行存引擎,基于列存引擎的复杂分析查询性能可以提升60-100X以上。
- 低成本存储:仅需为查询涉及列创建索引,列存索引空间占用仅为行存的10%-50%;无论行存、列存,扩展RO节点仅共享存储一份数据。
- PG生态兼容:支持原生PostgreSQL语法(CREATE/DROP INDEX),无需修改查询SQL,仅需要创建索引后,即可加速。
- 行列实时转换:行存数据毫秒/秒级生成列存索引,自动维护一致性,无需手动刷新。
- 智能查询路由:Cost + SQL耗时采样技术,实现动态的行列路由,选择最佳引擎执行。
与云原生架构的深度融合
从技术原理层面,PolarDB-PG IMCI通过改进存储引擎、执行引擎、优化器三个层面更好地适应复杂查询的需求。其中,存储引擎,采用更适合向量化算子的列存格式,而非PG默认的Heap行存结构;执行引擎,这一部分主要利用 DuckDB 的向量化算子来提供高效的计算;SQL优化器,根据代价自动选择行存或者列存执行查询请求。
PostgreSQL社区上有很多基于 DuckDB 的外挂分析库的实践,如 pg_duckdb、pd_mooncake 等等,但这类系统有一个共同的弊端,即:虽然是基于 PostgreSQL 插件机制实现,但与 PostgreSQL 本身割裂,在易用性、实时性、兼容性、产品化等问题上都很难满足实际需求。
PolarDB-PG IMCI在PG生态和云原生数据库架构上践行一体化HTAP理念,这就要求:a. 要完全兼容 PG 的使用习惯,语法和功能都要一致,同时不应对架构和业务有过多的侵入,最好是一行代码都不用改;b. DuckDB 做为「原子化」能力与PG和云原生架构融合,要能满足业务的实时性需求。基于上述理念,我们对 PG 和 DuckDB 两个引擎都做了深度的改进融合。
与云原生架构结合
DuckDB本身是嵌入式单机形态,天然并不支持共享存储、存算分离的多机处理模式,PolarDB IMCI通过引入多节点通信会话和协作事务处理机制,实现了与云原生架构的深度融合,无论行存数据还是列存数据,都支持弹性横向扩展,并借助PolarFS分布式文件系统以及OSS分层存储,多个计算节点始终共享一份数据,而不是每加一个计算节点都要借助数据同步额外存储一份数据,可大幅降低存储成本。
多样化列存形态
IMCI将DuckDB真正做为原子化能力嵌入,使用方式上达到更符合PG用户的使用习惯,支持两类列存使用方式,一种是TP和AP结合的行存表+列存索引组合方式,一种是直接创建列存表。基于 PG Index AM 接口实现了列存索引的形式,突破了 PG 最大只能 32 个列的限制,最多可以为 1600 列创建列存索引。
基础能力适配
优化了基于逻辑复制的行列转换,基本能满足秒级的实时性需求;深度适配了各类语法、数据类型的精度等;IMCI还为DuckDB实现了分区表以及分区裁剪能力,可在分区表上直接建立列存索引;正在建设的 hybrid scan,在 Join 查询中,即使部分小表没有创建列存索引,也能够和列存索引一起参与计算。
改进DuckDB
锁粒度优化:DuckDB 的读写锁颗粒度较大,会造成较长的事务阻塞;PolarDB-PG IMCI为其改进了锁的粒度,比如Checkpoint 期间对数据和 ART 索引的读写锁进行拆分,降低刷脏过程中的全局阻塞问题。
索引改进:DuckDB的ART索引会用于行列同步时高效率的定位待更新的数据,但也存在数据刷脏效率较低问题。PolarDB-PG IMCI一方面在行列转换阶段通过设计新的索引来替代ART,另一方面也在通过改进落盘机制来解决ART本身的问题。
垃圾回收:大量的事务更新后,列存文件空间膨胀严重,PolarDB-PG IMCI为其提供了真正的Vacuum能力(虽然DuckDB也有Vacuum语法,但并未对存储空间进行回收)。
在地平线自驾核心业务中的应用
地平线是行业领先的智驾科技公司,依托软硬结合的前瞻技术积淀,打造面向全场景的智能辅助驾驶解决方案。客户的自驾业务部门需要对大规模图像感知数据的元数据和标签数据进行面向TP和AP的一体化查询和聚合分析计算,支持感知、规控等业务部门对标签数据的提取和分析挖掘需求。
客户核心场景诉求
标签数据体量大,要求极高的数据聚合分析查询性能
标签数据表不仅包含标签信息,也包含图片等其他元数据信息,最大单表约50亿行的规模,日增量峰值约300G,年数据规模为几十TB。要求快速实现根据标签数据做聚合统计分析和挖掘,分析聚合大查询性能希望秒级返回。
一库实现多样化
与此同时,客户还有文本+向量混合搜索、AI、时空等方面需求。希望能借助PostgreSQL丰富的生态功能,在一个数据库内支撑上述需求,不用维护多种数据库,减少运维压力,专注业务开发。
较高的数据实时性和新鲜度
无论TP还是AP场景,都要求较高的数据新鲜度,TP业务入库即可见,AP业务延迟要求秒级;大部分表既有TP需求,也有AP需求,但部分表(10TB 级别)无TP需求,只需要分析。
支持湖表检索和多模态混合检索
客户标签的原始数据采用iceberg管理,希望数据库能直读iceberg,且能支持库内库外数据的联合查询与分析。
围绕IMCI核心能力实现数据价值落地
客户使用了PolarDB-PG大规格实例来支撑标签数据管理和挖掘业务,核心使用了基于IMCI列存索引+列存表的HTAP一体化方案能力。
🔷 标签挖掘计算性能,借助IMCI获得百倍性能提升
PG兼容:系统100%兼容PostgreSQL接口,存算分离,弹性扩展,满足客户要求兼容PG的各类查询能力,涉及多条件筛选/分页查询/多表关联查询/Top-K查询等,以及大表分区管理和查询能力。
标签管理:支持自驾业务灵活的标签格式,除了最常用的varchar形式,也支持原生Json类型的字段定义,可定义为Json Object和Json Array形式的各类标签格式;支持对Json字段的整体更新和指定路径更新(基于Json更新函数,如jsonb_set)。
标签挖掘:基于IMCI列存索引加速标签数据的统计分析计算,大部分业务场景较行存性能提升60X以上,个别标签挖掘业务场景提升100X性能,同时满足10:1高比例压缩;支持对Json类型字段的指定key进行转列存做聚合统计分析。
🔷 一体化支持湖表检索和多模态混合检索
湖表检索:使用polar_lakehouse插件,数据库直读iceberg,支持库内库外数据的联合查询与分析。
混合搜索:提供基于GIN的全文搜索引擎和基于PGVector的向量引擎,提供多路召回与混合检索能力。
🔷 秒级数据新鲜度,AP和TP一套系统
数据新鲜度:行存数据写入即可见,全文、向量等搜索索引秒内可见,列存索引秒级可见。
系统成本:针对部分表(10TB 级别)无TP需求,只需要分析,因此直接采用IMCI列存表进行组织和分析计算,性能与列存索引对齐,不再为此额外维护一个独立的AP系统,实现一套系统解决问题。
结语
PolarDB-PG IMCI 将基于 PostgreSQL 的行存引擎和基于 DuckDB 的列存引擎深度融入 PolarDB 统一云原生数据库架构,实现双擎合一,复杂查询分析性能百倍提升,助力企业实时数据洞察与分析决策。该功能上线以来,历经多个版本的持续迭代升级,在电商、金融、交通、汽车、社交等众多行业领域获得头部客户的应用,客户普遍反馈分析性能卓越,大幅提升了数据分析决策时效性。