pg_duckdb

在PostgreSQL中的嵌入式DuckDB扩展

概览

扩展包名版本分类许可证语言
pg_duckdb1.1.1OLAPMITC++
ID扩展名BinLibLoadCreateTrustReloc模式
2430pg_duckdb-
相关扩展pg_mooncake duckdb_fdw pg_analytics pg_parquet columnar citus citus_columnar orioledb
下游依赖pg_mooncake

conflict with duckdb_fdw

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.1.11817161514pg_duckdb-
RPMPIGSTY1.1.11817161514pg_duckdb_$v-
DEBPIGSTY1.1.11817161514postgresql-$v-pg-duckdb-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
d13.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u22.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u22.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u24.x86_64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
u24.aarch64
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1
PIGSTY 1.1.1

构建

您可以使用 pig build 命令构建 pg_duckdb 扩展的 RPM / DEB 包:

pig build pkg pg_duckdb         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_duckdb 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_duckdb;          # 当前活跃 PG 版本安装
pig ext install -y pg_duckdb -v 18  # PG 18
pig ext install -y pg_duckdb -v 17  # PG 17
pig ext install -y pg_duckdb -v 16  # PG 16
pig ext install -y pg_duckdb -v 15  # PG 15
pig ext install -y pg_duckdb -v 14  # PG 14
dnf install -y pg_duckdb_18       # PG 18
dnf install -y pg_duckdb_17       # PG 17
dnf install -y pg_duckdb_16       # PG 16
dnf install -y pg_duckdb_15       # PG 15
dnf install -y pg_duckdb_14       # PG 14
apt install -y postgresql-18-pg-duckdb   # PG 18
apt install -y postgresql-17-pg-duckdb   # PG 17
apt install -y postgresql-16-pg-duckdb   # PG 16
apt install -y postgresql-15-pg-duckdb   # PG 15
apt install -y postgresql-14-pg-duckdb   # PG 14

预加载配置

shared_preload_libraries = 'pg_duckdb';

创建扩展

CREATE EXTENSION pg_duckdb;

用法

pg_duckdb 文档

主题说明
函数所有可用函数的完整参考
语法指南与注意事项常见 SQL 模式与注意事项速查
类型支持的数据类型与类型映射
扩展DuckDB 扩展的安装与使用
配置配置选项与参数
事务事务行为与限制

快速上手

使用 pig 安装 pg_duckdb:

pig repo set
pig install pg_duckdb

编辑 postgresql.conf,然后重启使配置生效

shared_preload_libraries = 'pg_duckdb'
duckdb.allow_community_extensions = true

加速查询

通过 DuckDB 可以直接查询现有的 PostgreSQL 表,无需做任何修改:

-- pgbench -is 1000  # 使用 pgbench 初始化一些测试数据
CREATE EXTENSION pg_duckdb;

-- 默认行为,使用 PostgreSQL 原生引擎
SET duckdb.force_execution = false;
EXPLAIN ANALYZE SELECT count(*) FROM pgbench_accounts;

-- 现在查询将由 pg_duckdb 执行
SET duckdb.force_execution = true;
EXPLAIN ANALYZE SELECT count(*) FROM pgbench_accounts;

在本地笔记本电脑的 4 核虚拟机上,查询耗时从 8 秒降至 4 秒:

postgres@el9:5432/postgres=# SET duckdb.force_execution = true;
EXPLAIN ANALYZE SELECT count(*) FROM pgbench_accounts;
SET
Time: 0.206 ms
                                              QUERY PLAN
------------------------------------------------------------------------------------------------------
 Custom Scan (DuckDBScan)  (cost=0.00..0.00 rows=0 width=0) (actual time=0.001..0.001 rows=0 loops=1)
   DuckDB Execution Plan:

 ┌─────────────────────────────────────┐
 │┌───────────────────────────────────┐│
 ││    Query Profiling Information    ││
 │└───────────────────────────────────┘│
 └─────────────────────────────────────┘
 EXPLAIN ANALYZE  SELECT count(*) AS count FROM pgduckdb.public.pgbench_accounts
 ┌────────────────────────────────────────────────┐
 │┌──────────────────────────────────────────────┐│
 ││               Total Time: 3.89s              ││
 │└──────────────────────────────────────────────┘│
 └────────────────────────────────────────────────┘
 ┌───────────────────────────┐
 │           QUERY           │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │      EXPLAIN_ANALYZE      │
 │    ────────────────────   │
 │           0 rows          │
 │          (0.00s)          │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │    UNGROUPED_AGGREGATE    │
 │    ────────────────────   │
 │        Aggregates:        │
 │        count_star()       │
 │                           │
 │           1 row           │
 │          (0.00s)          │
 └─────────────┬─────────────┘
 ┌─────────────┴─────────────┐
 │         TABLE_SCAN        │
 │    ────────────────────   │
 │           Table:          │
 │      pgbench_accounts     │
 │                           │
 │      100,000,000 rows     │
 │          (3.88s)          │
 └───────────────────────────┘

数据湖

以下示例演示如何使用本地 MinIO 实例操作数据湖:

SELECT duckdb.create_simple_secret(
    type := 'S3', key_id := 's3user_data', secret := 'S3User.Data',
    endpoint := 'https://sss.pigsty:9000', url_style := 'path'
);

最后修改 2026-03-08: add extension catalog (baacba6)