pg_duckdb
在PostgreSQL中的嵌入式DuckDB扩展
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_duckdb | 1.1.1 | OLAP | MIT | C++ |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 2430 | pg_duckdb | 否 | 是 | 是 | 是 | 否 | 否 | - |
| 相关扩展 | pg_mooncake duckdb_fdw pg_analytics pg_parquet columnar citus citus_columnar orioledb |
|---|---|
| 下游依赖 | pg_mooncake |
conflict with duckdb_fdw
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 1.1.1 | 1817161514 | pg_duckdb | - |
| RPM | PIGSTY | 1.1.1 | 1817161514 | pg_duckdb_$v | - |
| DEB | PIGSTY | 1.1.1 | 1817161514 | postgresql-$v-pg-duckdb | - |
构建
您可以使用 pig build 命令构建 pg_duckdb 扩展的 RPM / DEB 包:
pig build pkg pg_duckdb # 构建 RPM / DEB 包
安装
您可以直接安装 pg_duckdb 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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;
用法
| 主题 | 说明 |
|---|---|
| 函数 | 所有可用函数的完整参考 |
| 语法指南与注意事项 | 常见 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'
);