暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DuckDB与PostgreSQL结合一下,PostgreSQL会如虎添翼

背景

DuckDB简介

DuckDB 是一款嵌入式数据库,主要用于嵌入其他程序执行快速的 SQL 分析查询,官方称其为“分析型 数据库中的 SQLite”。DuckDB 易于安装和使用,没有外部依赖,同时提供了 C/C++、Python 以及 R 的 语言绑定。  DuckDB 由荷兰 Centrum Wiskunde & Informatica 的数据库架构组开发,他们还开发了 MonetDB (一款开源的列式存储数据库)。DuckDB 采用 MIT 开源协议,并且在 GitHub 上开放了源代码。DuckDB 于 2019 年 6 月 27日首次发布了官方的 0.1 发布版。

关于它的更多的介绍,可以见论文:https://duckdb.org/pdf/SIGMOD2019-demo-duckdb.pdf

DuckDB就是位于问号这个区域的。

目录已经到了:0.70版了。看看他们官宣的BLOG/News: (https://duckdb.org/news/)

使用

我之所以写这个短文,是因为发现DuckDB里头有一些非常有用的东西,可以直接拿来用。它实在是太简易了。只有一个二进制可执行文件。然后命令也简单。把它用到PostgreSQL当中,做辅助工具,简直不要太方便。

详细的用法可以见官方文档:https://duckdb.org/docs/ 对它的文档编排,我还是非常赞的。实例非常丰富也明了,没有废话。

这里仅举两个例子来佐证它的方便:

1、直接访问PostgreSQL中的表

早在去年的时候,有duckdb_fdw插件提供给PG, 于是PG可以访问duckdb中的数据,这意味着啥?这意味着PG可以充分利用DUCKDB强大的分析功能。duckdb_fdw的编译安装使用,不缀述。大家可以直接在网上找到相应的使用方法。

我要说的是它现在支持直接访问PG中的表,虽然是只读方式,但也足够爽一爽了。

只需要简单的运行:

INSTALL postgres;
LOAD postgres;

复制

然后配置一下连接信息即可:

CALL postgres_attach('dbname=mydb user=postgres host=127.0.0.1 password=**** port=5555', source_schema='public', sink_schema='abc');

复制

我们在PG端准备点表和数据:

mydb=# \d
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | t123 | table | postgres
(1 row)

mydb=# create table t(id int, col2 varchar(32));
CREATE TABLE
mydb=# insert into t select n, 'test' || n from generate_series(1, 10) as n;
INSERT 0 10

复制

回到duckdb命令行:

[21:45:49-postgres@sean-rh3:/pgccc/source/duckdb]$ ./duckdb abc.db
v0.7.1 b00b93f0b1
Enter ".help" for usage hints.

INSTALL postgres;
LOAD postgres;

D  postgres_attach('dbname=mydb user=postgres host=127.0.0.1 password=****** port=5555', source_schema='public', sink_schema='abc');
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ 0 rows  │
└─────────┘
D .tables
t     t123

select * from t123;
┌───────┬─────────┐
│  id   │  col2   │
│ int32 │ varchar │
├───────┼─────────┤
│     1 │ wang    │
└───────┴─────────┘
select * from t;
┌───────┬─────────┐
│  id   │  col2   │
│ int32 │ varchar │
├───────┼─────────┤
│     1 │ test1   │
│     2 │ test2   │
│     3 │ test3   │
│     4 │ test4   │
│     5 │ test5   │
│     6 │ test6   │
│     7 │ test7   │
│     8 │ test8   │
│     9 │ test9   │
│    10 │ test10  │
├───────┴─────────┤
│     10 rows     │
└─────────────────┘
-- 实际上创建的是视图,不能删除数据
delete from t;
Error: Binder Error: Can only delete from base table!

复制

这意味着,我们可以直接对PG中的表数据进行强大的分析操作。臆想空间很大。

2、直接查询访问csv文件

调整PG配置,让它生成csv log文件:

vi postgresql.conf
log_destination = 'csvlog'
logging_collector = on
log_min_messages = debug1

复制

重启PG, 执行几条简单的SQL。

mydb=# insert into t select 1, 'test100'; \watch 0.5;
INSERT 0 1
Wed 19 Apr 2023 10:04:55 PM UTC (every 0.5s)
INSERT 0 1

Wed 19 Apr 2023 10:04:55 PM UTC (every 0.5s)
INSERT 0 1

Wed 19 Apr 2023 10:04:56 PM UTC (every 0.5s)
INSERT 0 1

Wed 19 Apr 2023 10:04:56 PM UTC (every 0.5s)
INSERT 0 1

Wed 19 Apr 2023 10:04:57 PM UTC (every 0.5s)
INSERT 0 1

复制

这时我们看看文件:postgresql-2023-04-19.csv,已经有不少内容了。

看看duckdb如何直接访问这个文件:

SELECT * FROM read_csv_auto('/opt/pg/14/data/log/postgresql-2023-04-19.csv'limit 2;
┌──────────────────────┬──────────┬──────────┬────────┬──────────┬───┬──────────┬──────────┬────────────┬──────────┬───────┐
│ 2023-04-19 22:03:4…  │ column01 │ column02 │ 386704 │ column04 │ … │ column21 │ column22 │ postmaster │ column24 │  0_1  │
│      timestamp       │ varchar  │ varchar  │ int64  │ varchar  │   │ varchar  │ varchar  │  varchar   │ varchar  │ int64 │
├──────────────────────┼──────────┼──────────┼────────┼──────────┼───┼──────────┼──────────┼────────────┼──────────┼───────┤
│ 2023-04-19 22:03:4…  │          │          │ 386704 │          │ … │          │          │ postmaster │          │     0 │
│ 2023-04-19 22:03:4…  │          │          │ 386704 │          │ … │          │          │ postmaster │          │     0 │
├──────────────────────┴──────────┴──────────┴────────┴──────────┴───┴──────────┴──────────┴────────────┴──────────┴───────┤
│ 2 rows                                                                                             26 columns (10 shown) │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

复制

我们需要做的,可能就是为这个csv文件添加上表头。但这已经非常方便了。

总结与展望:

DuckDB它的非常友好的license策略,同时它的突出的使用范围,让它显得有些独一无二。禁不住又想拿它去做一些东西了 :-)  我们可以拿它去做一些大型应用的底层分析引擎,直接调用API即可,非常方便。甚至可以把它集成到别的数据库产品当中,充分分析引擎的一个扩充。

很多年前,我们就曾经自己开发过空间数据引擎,试想,如果有现成的功能非常好的完全没有license障碍的代码库直接可以复用,何乐而不为呢。

就算是平时工作中,如果有一些关系型数据、平面文件,需要基于这些数据做些分析,可以直接通过DuckDB进行load/query,并得到有效的结果。

在与PG的结合上,PG可以通过duckdb_fdw,访问duckdb中的数据,并得到分析结果,反过来,duckdb居然可以直接访问PG中的数据库表(只读形式),执行复杂的分析,并得到结果。有点逆天的感觉。

真的很看好这个sqlite的OLAP孪生兄弟。甚至有想把它改造成非嵌入式的冲动。

参考:

[1] DuckDB extension: postgres scanner:
   https://duckdb.org/docs/extensions/postgres_scanner

[2] DuckDB Blog: News:  https://duckdb.org/news/

[3] Digoal Blog: :  https://github.com/digoal/blog


PG考试认证咨询


2023年PostgreSQL考试认证开班计划
PostgreSQL认证讲师全国招募
PostgreSQL培训认证开班通知 | PCM认证大师第8营
PostgreSQL证书发放通知 | PCP认证专家
最佳学员:PostgreSQL 认证专家(PCP)严世超
最佳学员:PostgreSQL 认证专家(PCP)奚之宝(深圳麦凯莱)
最佳学员:PostgreSQL 认证专家(PCP)余小勇
最佳学员:PostgreSQL 认证专家(PCP)缪晓丽(江苏新大陆)
优秀学员:PCA第11营最佳学员
PostgreSQL-PCP认证考试(上海站)成功举办
PostgreSQL-PCP认证专家考试(培训)-北京站-成功举办
PostgreSQL-PCM认证大师考试(天津站)成功举办


文章转载自PostgreSQL考试认证中心,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论