七月 8, 2026
摘要:在本教程中,您将学习如何在 PostgreSQL 中使用 pg_duckdb 加速数据分析。
目录
核心观点与背景
- 当前痛点:PostgreSQL 是业界最受信任的开源关系型数据库,在处理 OLTP(在线事务处理)时表现优异。但在处理 OLAP(在线分析处理)的大型聚合查询时存在瓶颈。传统做法通常需要通过 ETL 将数据导出到专门的数据仓库中才能进行高效分析。
- 解决方案:
pg_duckdb是一个 PostgreSQL 扩展插件,它将 DuckDB 的列式向量化分析引擎直接嵌入到 PostgreSQL 数据库中。 - 核心价值:用户无需切换数据库,无需迁移或同步数据,只需启用该扩展,即可在一个数据库实例中同时获得强大的 OLTP 与 OLAP 能力。

核心原理解析:PostgreSQL 与 DuckDB 的深度对比
由于架构设计的不同,两者在不同场景下各有所长。两者的底层特性对比如下:
| 对比维度 | PostgreSQL (OLTP 冠军) | DuckDB (OLAP 利器) |
|---|---|---|
| 数据存储 | 行式存储 (Row-oriented):按行读取,分析时即便只需少数列也会读取整行数据,导致 I/O 资源浪费。 | 列式存储 (Columnar):按列读取压缩数据块,极大节省 I/O 资源并提升分析速度。 |
| 执行模型 | Volcano 迭代器:逐行处理数据,无法充分利用现代 CPU 缓存和 SIMD 指令。 | 向量化执行 (Vectorized):批量(数千个值)处理数据,执行效率极高。 |
| 并发与并行 | 基于 MVCC 优化高并发多用户场景(每秒大量小事务);并行查询能力有上限。 | 针对单一大型复杂查询优化;自动并行化,能够利用所有 CPU 核心。 |
| 外部数据源 | 默认读取数据库内部的表。 | 原生支持数据湖,可直接读取 Parquet、CSV、JSON、Iceberg 等文件,无论在本地还是对象存储(如 S3 对象存储)上,均无需导入。 |
| 架构 | 传统的 C/S(客户端-服务器)架构。 | 进程内(In-process)嵌入式数据库,无独立服务端,零配置启动。 |

pg_duckdb 的工作机制
pg_duckdb 的强大之处在于它对应用层的透明性。客户端不需要改变连接方式、协议或 SQL 语句:
- 查询拦截:Postgres 解析器生成解析树后,
pg_duckdb会检查该查询是否适合使用分析引擎执行。 - 接管与执行:如果适合,生成 DuckDB 执行计划并交由其向量化引擎极速处理;最终将结果通过 Postgres 返回给客户端。
- 透明回退 (Automatic Fallback):如果遇到不支持的查询(如
INSERT或 DuckDB 暂不支持的特定功能),插件会静默将其交还给 Postgres 的原生计划器。保证业务永不中断,零代码侵入。

pg_duckdb 的三大核心“超能力”
pg_duckdb 扩展在 PostgreSQL 上的三个关键应用场景:
1. 零代码修改,加速现有表分析
- 只需开启参数
set duckdb.force_execution = on;。 - 原有针对 Postgres 表的聚合分析查询(如
GROUP BY)会自动路由到 DuckDB 引擎。 - 测试结果:在 TPC-H 基准测试演示中,相同数据的查询速度相较原生引擎提升了 2 倍至 7 倍不等。
2. 直接读写云端对象存储

- 告别 ETL 管道,无需将海量日志或文件导入数据库中。
- 可以通过简单的 SQL 函数(如
read_parquet)直接查询存储在 S3 对象存储上的 Parquet 历史文件,甚至可以直接将分析结果写回 S3 对象存储。
3. 最强功能:混合分析

- 场景:能够在一个 SQL 查询中,将 Postgres 中实时的业务表(例如:活跃的投资组合监视列表)与 S3 对象存储中的外部文件(例如:海量的历史股票交易记录 Parquet 文件)进行直接
JOIN联表查询。 - 优势:在单一引擎中无缝融合了“热”运行数据与“冷”历史归档数据,没有中间抽取步骤,也没有数据冗余。
核心结论
- 一个数据库,两个引擎:兼顾 ACID 事务安全(Postgres)与极速的分析性能(DuckDB)。
- 零数据搬运:无需通过管道移动数据,直接使用 SQL 查询数据湖(Data Lake)或对象存储。
- 统一的混合分析:单一 SQL 语句即可联合查询活跃的关系型数据与外部大文件。
- 相同的 SQL,更快的响应:完全不需要重新学习新系统或修改现有查询代码,仅改变底层计算引擎便可获得极速体验。
参考
pg_duckdb in Action: Accelerating Analytics on Azure Database for PostgreSQL