什么是 DuckDB?
DuckDB 是一个开源的、嵌入式的 SQL OLAP 数据库管理系统。它专门为数据分析场景设计,采用列式存储引擎和向量化执行技术,在分析型查询上比传统行式数据库(如 SQLite)快 10-100 倍。
DuckDB 的 5 大核心优势
- 嵌入式运行:无需安装数据库服务器,直接嵌入到应用程序进程中
- 列式存储:分析查询只读取需要的列,大幅减少 I/O
- 向量化执行:批量处理数据,充分利用 CPU cache
- 完整 SQL 支持:支持窗口函数、CTE、GROUPING SETS 等高级 SQL 特性
- 多语言绑定:Python、R、Java、Node.js、C/C++ 均支持
适用场景
| 场景 | 推荐度 | 说明 |
|---|---|---|
| 数据分析与探索 | ⭐⭐⭐ | 秒级响应百万行数据查询 |
| ETL 数据处理 | ⭐⭐⭐ | 零配置的数据清洗管道 |
| BI 报表引擎 | ⭐⭐⭐ | 替代传统 BI 工具的后端 |
| 嵌入应用 | ⭐⭐⭐ | 作为应用的嵌入式分析引擎 |
| 教学工具 | ⭐⭐⭐ | 零安装上手 SQL 学习 |
| OLTP 事务 | ❌ | 不适合高并发写入场景 |
安装 DuckDB
MacOS
brew install duckdb
Linux (Ubuntu/Debian)
curl https://install.duckdb.org | sh
Windows
下载最新的 Windows 版本安装包,或使用:
winget install DuckDB.cli
Python (pip)
pip install duckdb
验证安装
duckdb --version
# v1.5.3
DuckDB 的 SQL 查询入门
创建表与插入数据
CREATE TABLE sales (
product VARCHAR,
category VARCHAR,
amount DECIMAL(10,2),
sale_date DATE
);
INSERT INTO sales VALUES
('笔记本电脑', '电子产品', 5999.00, '2026-01-15'),
('机械键盘', '外设', 399.00, '2026-01-16'),
('显示器', '电子产品', 2499.00, '2026-01-17');
基本查询
-- 查询所有数据
SELECT * FROM sales;
-- 聚合查询
SELECT category, COUNT(*) AS count, SUM(amount) AS total
FROM sales
GROUP BY category
ORDER BY total DESC;
-- 窗口函数
SELECT product, amount,
RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;
DuckDB 独有的 SQL 扩展
QUALIFY 子句:直接在窗口函数后过滤
SELECT product, amount,
RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales
QUALIFY rank <= 3;
GROUP BY ALL:自动按 SELECT 中的非聚合列分组
SELECT category, product, SUM(amount)
FROM sales
GROUP BY ALL;
COLUMNS 表达式:批量选择/排除列
-- 排除某些列
SELECT * EXCLUDE (sale_date) FROM sales;
-- 批量替换列
SELECT REPLACE(amount * 1.1 AS amount) FROM sales;
DuckDB Python 集成
安装与连接
import duckdb
# 内存数据库
conn = duckdb.connect()
# 持久化数据库
conn = duckdb.connect('my_database.duckdb')
执行 SQL 查询
result = conn.execute('SELECT 1 + 1').fetchall()
print(result) # [(2,)]
Pandas DataFrame 集成
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
result = conn.execute('''
SELECT a, SUM(b) as total
FROM df
GROUP BY a
''').fetchdf()
直接查询文件
# 查询 CSV 文件
conn.execute("SELECT * FROM 'data.csv'").fetchdf()
# 查询 Parquet 文件
conn.execute("SELECT * FROM 'data.parquet'").fetchdf()
# 查询 JSON 文件
conn.execute("SELECT * FROM 'data.json'").fetchdf()
性能优化技巧
1. 使用 Parquet 格式
Parquet 列式存储配合 DuckDB 的列式引擎,查询速度比 CSV 快 10-50 倍。
2. 分区裁剪
SELECT * FROM read_parquet('data/*.parquet', hive_partitioning=true)
WHERE year = 2026 AND month = 5;
3. 内存管理
-- 设置最大内存
SET memory_limit = '4GB';
-- 设置线程数
SET threads = 4;
4. 使用物化视图
CREATE VIEW monthly_sales AS
SELECT category, SUM(amount) AS total
FROM sales
GROUP BY category;
DuckDB vs 其他工具
| 特性 | DuckDB | SQLite | Pandas | ClickHouse |
|---|---|---|---|---|
| 分析查询 | ⭐⭐⭐ | ⭐ | ⭐⭐ | ⭐⭐⭐ |
| 单行查询 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
| 内存效率 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐ | ⭐⭐⭐ |
| 部署难度 | 零配置 | 零配置 | 需环境 | 需服务器 |
| Python 集成 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐ |
| 适合场景 | 数据分析 | 本地存储 | 数据清洗 | 实时分析 |
与 AI/LLM 结合
DuckDB 可以作为 AI Agent 的「数据大脑」:
- 自然语言查询数据库:AI Agent 分析用户问题 → 生成 SQL → DuckDB 执行 → 返回结果
- RAG 数据准备:使用 DuckDB 清洗和预处理大规模文档数据
- ML 推理:通过 infera 扩展直接在数据库内运行机器学习模型
生产部署建议
Docker 部署
docker run -v $(pwd)/data:/data -p 5432:5432 duckdb/duckdb
资源限制
SET memory_limit = '4GB';
SET threads = 4;
SET temp_directory = '/tmp/duckdb_tmp';
持久化与备份
- 数据库文件默认以
.duckdb扩展名保存 - 定期备份数据库文件即可
- 支持导出为 Parquet 文件作为备份格式
下一步学习
- DuckDB Python 集成指南 — Python + DuckDB 完整示例
- DuckDB SQL 语法速查 — 从 SELECT 到 PIVOT
- DuckDB 性能调优 — 50GB 数据 150x 提速
- DuckDB 实战案例 — 电商运营看板
