DuckDB: it's not quack science
摘要
DuckDB是一个开源嵌入式分析型数据库,支持直接查询文件、嵌入应用,并提供友好的SQL扩展,在数据分析场景下比传统Unix管道更高效。
<p><a href="https://lobste.rs/s/stbnxi/duckdb_it_s_not_quack_science">Comments</a></p>
查看缓存全文
缓存时间: 2026/06/03 13:46
**TL;DR:** DuckDB 是一个开源、嵌入式、支持 SQL 的分析型数据库,既可以作为命令行工具直接查询文件,也可以作为库嵌入应用,在快速数据分析场景下比传统 Unix 管道更灵活高效。
## DuckDB 概览
DuckDB 是基于 MIT 许可证的开源关系型数据库,采用 PostgreSQL 的 SQL 方言。代码约一百万行 C++,无外部依赖,可编译为约 50 MB 的单一二进制文件,无需 root 或 sudo 即可运行。演讲者 Gabor Sarn 从三个角度展示 DuckDB 的灵活性:命令行工具、便携数据库和数据库服务器。
## 命令行工具
### 直接查询文件
安装后输入 `duckdb` 即可进入 REPL。DuckDB 允许直接在查询中引用 CSV/TSV 文件,无需预先创建表或定义模式。例如,要列出高速铁路经过的不同国家:
```sql
SELECT DISTINCT country FROM 'stations.tsv';
```
自动检测表头、字段类型并加载为临时表,结果与 Unix 管道 `cat stations.tsv | tail -n +2 | cut -f2 | sort -u` 一致,但更简洁。
### 在管道中工作
DuckDB 支持 Unix 管道组合:`duckdb -c "SELECT ..."` 可接受标准输入或输出到标准输出,作为管道中间环节。对于更复杂的分析(如 JOIN 两个文件),DuckDB 只需一行 SQL:
```sql
SELECT * FROM 'trains.tsv' JOIN 'stations.tsv' USING (station);
```
而纯 Unix 工具实现则需要预排序、处理表头、awk 拼接等繁琐步骤,随着查询复杂度增加会变得难以维护。
### Pivot 与友好 SQL
DuckDB 支持标准 SQL 之外的扩展,例如 PIVOT 操作。演示中,根据距离伦敦的数据创建站点间距离矩阵,并通过 `EXCLUDE` 子句批量转换单位(公里转英里):
```sql
SELECT station1, * EXCLUDE (station1) / 1.61::INTEGER FROM pivot_result;
```
同样,UNPIVOT 可将宽表还原为长表,利用列星号(`COLUMNS(*)`)简化操作。
### CLI 总结
DuckDB 在 CLI 下:无需持久化存储,内存模式运行良好;支持自动并行化;可溢出到磁盘;类型安全且易于调试。演讲者对比了行计数性能:在 macOS 上 DuckDB 曾快于 BSD 的 `wc`,但在 2026 年 Rust 重写的 `wc`(uutils)已明显领先。
## 便携数据库
DuckDB 可嵌入各类应用,提供 Python、Go、Rust、Java、JavaScript、R 等语言驱动,并支持 WebAssembly 在浏览器中运行。使用方式类似普通库:
```python
import duckdb
con = duckdb.connect('my.db')
con.execute("FROM 'services*' LOAD DATA...")
```
### 性能演示
以荷兰火车数据集(1.6 亿行,21 GB CSV)为例,DuckDB 在现代笔记本上加载速度约 1 GB/s,加载后查询平均延误时间仅 150 毫秒。结果可直接转换为 pandas DataFrame 用于可视化。
## 友好 SQL
DuckDB 致力于平滑 SQL 使用体验。演示中展示了一种将 CSV 文件直接置于 `FROM` 子句的写法(演讲中断于此,但上下文表明友好的 SQL 扩展使得原本繁琐的跨列操作变得简洁)。
---
**Source:** [YouTube: DuckDB: it's not quack science](https://www.youtube.com/watch?v=q6S0Vv4u3iM)
相似文章
DuckDB 1.5.2 – 可在笔记本、服务器、浏览器中运行的 SQL 数据库
DuckDB 1.5.2 带来生产就绪的 DuckLake v1.0 湖仓格式、Iceberg 扩展改进、Jepsen 测试,以及支持文件存储的全新浏览器 Shell。
Quack:DuckDB 的客户端-服务器协议
DuckDB 引入了名为“Quack”的全新客户端-服务器协议,使得 DuckDB 实例能够通过 HTTP 进行通信,在支持并发写入和远程访问的同时,保持简单性与高性能。
DuckPGQ – 一个用于图工作负载的DuckDB社区扩展
DuckPGQ 是一个 DuckDB 社区扩展,它为 DuckDB 增加了 SQL/PGQ 标准图查询能力,从而在分析工作流中实现高性能图分析。
@tobi: Ducklake 与 duckdb 真的非常好用。如果你要求你的智能体导入大量数据(例如健康数据…)
Tobi 推荐使用 Ducklake 与 DuckDB 来高效导入数据(例如来自 Fitbit 的健康数据),并建议告诉智能体学习它。
@Huahuazo: 搞数据库的兄弟们,注意了——以后真不用再装一桌面的客户端了。 挖到一个宝藏工具 DBX,一个客户端直接打通所有主流数据库: ① MySQL、PostgreSQL、SQLite ② Redis、MongoDB、ClickHouse ③ 连国…
DBX 是一款轻量级多数据库客户端,支持 MySQL、PostgreSQL、Redis、MongoDB 等 60+ 数据库,安装包仅 15MB,内置 AI 助手可自然语言生成 SQL。