给大象插上翅膀:DuckDB(pg_duckdb)在 Postgres 中实现更快速的分析
liuian 2025-08-31 04:04 21 浏览
在数据管理领域,PostgreSQL(pg)作为一款出色的在线事务处理(OLTP)数据库,凭借其强大的事务处理能力和可靠性,赢得了广泛的认可。然而,当面对大规模数据分析时,pg 有时显得局促,响应速度也未能满足高效分析的需求。
近一段时间来,DuckDB 作为一款高效的列式数据库引擎,正在数据分析领域引起越来越多的关注。其轻量级的设计和强大的查询性能,使其在处理大规模数据集时展现出优异的表现,DuckDB 可以为数据湖(Data Lake)或湖屋(Lakehouse)架构带来了快速、便捷的分析能力,也是推动数据分析向更高效、灵活的方向发展的重要组件。
在这种情况下,pg_duckdb 作为一项创新的扩展,为 PostgreSQL 注入了新的活力,仿佛为这头大象插上了翅膀。通过将 DuckDB 的分析引擎与 PostgreSQL 深度集成,pg_duckdb 提供了一种便捷、简单且高效的数据分析架构,使用户能够快速执行复杂的分析查询,充分挖掘数据的潜力。
pg_duckdb 是一个 PostgreSQL 扩展,将 DuckDB 的分析引擎直接集成到 PostgreSQL 中,允许在传统事务工作负载上支持快速进行数据分析查询。接下来的内容我们快速体验一下,感受高效的数据分析能力.
镜像安装带有pg_duckdb的PG
最简单的入门方法是使用提供的 Docker 镜像,该镜像包含了最新版本的 pg_duckdb 扩展预安装的 PostgreSQL。详细参见:https://github.com/duckdb/pg_duckdb ; 为了便于测试,推了镜像到阿里云的ACR上,下面命令创建测试实例容器:
docker run -d --name pg_duckdb -p 54322:5432 -e POSTGRES_HOST_AUTH_METHOD=trust registry.cn-hangzhou.aliyuncs.com/smartnotebook/pg_duckdb:17-v0.1.0在psql 输入:SELECT * FROM pg_extension; 可看到pg 的扩展项包括:gp_duckdb .
PostgreSQL 是一款事务性数据库,而非分析性数据库。它非常适合查找、小规模更新以及在仔细设置索引和连接关系后运行查询。然而,当需要在整个数据集上运行临时分析查询时,它并不是最佳选择。
尽管 PostgreSQL 并不是专门为分析设计的,但它常常被用于分析,因为数据随时可用,便于启动。然而,随着数据量的增加,以及对更复杂的聚合和分组分析查询的需求,用户常常会遇到限制。这时,像 DuckDB 这样的分析数据库引擎便能派上用场。
通过 pg_duckdb,你可以在 PostgreSQL 中使用 DuckDB 执行引擎处理已存储的数据,对于某些查询,这可能会显著提升性能。以下是一个查询示例,显示了显著的性能提升;
在带有pg_duckdb的PG上测试TPC-DS 用例1
让我们尝试 TPC-DS 基准测试套件中的第一个查询(用例1),该查询包含在 TPC-DS DuckDB 扩展中。详细参见:《使用SNB 进行DuckDB的TPC-DS 测试:性能强悍》
使用该扩展,在duckdb 使用规模因子 1(即总数据为 1GB左右)生成 TPC-DS 数据集,然后导出再加载到没有索引的 PostgreSQL 中。下面代码是smarnotebook 执行dfSQL(duckdb 引擎)或在duckdb 内执行SQL生成tpcds的测试数据集。
INSTALL tpcds;
LOAD tpcds;
CALL dsdgen(sf = 1);
EXPORT DATABASE 'public' (FORMAT CSV, DELIMITER '|');
-- PRAGMA tpcds(1);导出后的数据文件和SQL 脚本如下:
将数据迁移到带有pg_duckdb插件的PG 容器中,执行下面的指令,就可以tpcds 数据集加载到pg数据库中。
export schema_name=public
sed 's/COPY/\\copy/' "$schema_name/load.sql" >"$schema_name/load-psql.sql"
psql -v ON_ERROR_STOP=1 "options=--search-path=$schema_name" -c "CREATE SCHEMA IF NOT EXISTS $schema_name" -f "$schema_name/schema.sql" -f "$schema_name/load-psql.sql" -c "ANALYZE;"加载收据后,执行用例1 的SQL, 用例SQL参见
:https://github.com/duckdb/duckdb/tree/main/extension/tpcds/dsdgen/queries ; 下面在smartnotebook 内创建数据源连接,并分别以pg 和pg_duckdb 内核执行(设置参数SET duckdb.force_execution = True | False):
SET duckdb.force_execution = True;
WITH customer_total_return AS
(SELECT sr_customer_sk AS ctr_customer_sk,
sr_store_sk AS ctr_store_sk,
sum(sr_return_amt) AS ctr_total_return
FROM store_returns,
date_dim
WHERE sr_returned_date_sk = d_date_sk
AND d_year = 2000
GROUP BY sr_customer_sk,
sr_store_sk)
SELECT c_customer_id
FROM customer_total_return ctr1,
store,
customer
WHERE ctr1.ctr_total_return >
(SELECT avg(ctr_total_return)*1.2
FROM customer_total_return ctr2
WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk)
AND s_store_sk = ctr1.ctr_store_sk
AND s_state = 'TN'
AND ctr1.ctr_customer_sk = c_customer_sk
ORDER BY c_customer_id
LIMIT 5;SET duckdb.force_execution = False 的情况下(使用PG 自有的方式)执行结果如下,执行时间为250秒。
SET duckdb.force_execution = True 的情况下(使用gp_duckdb的duckdb 内核)执行结果如下,执行时间为0.3秒。
性能足足提升1000倍。
在数据湖(Data Lake)或湖屋(Lakehouse)中使用 pg_duckdb
DuckDB 原生支持在外部对象存储上读取和写入文件,因此非常适合用于查询数据湖中的数据。DuckDB 还可以从 Iceberg 和 Delta 中读取数据,让你能够利用湖屋架构。以下测试代码片段使用了来自公共桶的数据集。
分析 Parquet 文件
以下查询使用 pg_duckdb 查询存储在 S3 中的 Parquet 文件,以找出 2020-2022 年美国最受欢迎的电视节目。
SELECT Title, max("Days In Top 10")::int as MaxDaysInTop10
FROM read_parquet('s3://duckdb-md-dataset-121/netflix_daily_top_10.parquet')
AS ("Days In Top 10" varchar, Title varchar, Type varchar)
WHERE Type = 'TV Show'
GROUP BY Title
ORDER BY MaxDaysInTop10 DESC
LIMIT 5;分析 Iceberg 表
为了查询 Iceberg 中的数据,你首先需要安装 DuckDB Iceberg 扩展。在 pg_duckdb 中,安装 duckdb 扩展可以使用 duckdb.install_extension(<扩展名称>) 函数。
-- Install the iceberg extension
SELECT duckdb.install_extension('iceberg');
-- Total quantity of items ordered for each `l_shipmode`
SELECT l_shipmode, SUM(l_quantity) AS total_quantity
FROM iceberg_scan('s3://us-prd-motherduck-open-datasets/iceberg/lineitem_iceberg', allow_moved_paths := true)
AS l(l_shipmode varchar, l_quantity int)
GROUP BY l_shipmode
ORDER BY total_quantity DESC;写回数据湖(Data Lake)或湖屋(Lakehouse)
在 pg_duckdb 中,对数据湖的访问不仅限于只读操作,你还可以使用 COPY 命令进行写回。请注意,你可以混合使用原生 PostgreSQL 数据,因此可以利用此功能将数据从 PostgreSQL 表导出到外部数据湖存储。
COPY (
SELECT Title, max("Days In Top 10")::int AS MaxDaysInTop10
FROM read_parquet('s3://us-prd-motherduck-open-datasets/netflix/netflix_daily_top_10.parquet')
AS ("Days In Top 10" varchar, Title varchar, Type varchar)
WHERE Type = 'TV Show'
GROUP BY Title
ORDER BY MaxDaysInTop10 DESC
LIMIT 5
) TO '/home/results.parquet';pg_duckdb 虽然处于测试阶段,未来的发展备受期待。DuckDB 的成功源于其简单性,这一优势将直接带给 PostgreSQL 用户,使其在现有数据库中发挥分析的作用和价值。
相关推荐
- 搭建一个20人的办公网络(适用于20多人的小型办公网络环境)
-
楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...
- 笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)
-
1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...
- 汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)
-
使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...
- xpsp3安装版系统下载(windowsxpsp3安装教程)
-
xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...
- 没有备份的手机数据怎么恢复
-
手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。 2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。 3、...
- 电脑怎么激活windows11专业版
-
win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...
- 华为手机助手下载官网(华为手机助手app下载专区)
-
华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...
- 光纤线断了怎么接(宽带光纤线断了怎么接)
-
宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...
- win7旗舰版和专业版区别(win7旗舰版跟专业版)
-
1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...
- 万能连接钥匙(万能wifi连接钥匙下载)
-
1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...
- 雨林木风音乐叫什么(雨林木风是啥)
-
雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...
- aics6序列号永久序列号(aics6破解序列号)
-
关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...
- 手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)
-
答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
