DuckDB Python 本地分析資料庫教學:取代 SQLite 與 Pandas 的最佳選擇(2026)
為什麼你需要認識 DuckDB?
如果你曾經用 Pandas 處理幾百萬行的 CSV 檔案,應該很熟悉那種痛苦:記憶體爆炸、速度緩慢。SQLite 雖然輕量,但它是針對交易型 OLTP 場景設計的,遇到分析型查詢同樣力不從心。
DuckDB 就是為了解決這個問題而生的。它是一個嵌入式的 OLAP 資料庫,可以直接在 Python 裡執行,不需要伺服器,卻能以驚人的速度處理大量資料。
DuckDB 是什麼?它和 SQLite、Pandas 有什麼不同?
- SQLite:OLTP,適合少量資料讀寫,例如 App 本地儲存
- Pandas:記憶體內 DataFrame 操作,大資料集容易 OOM
- DuckDB:OLAP,針對大量資料掃描和聚合最佳化,支援列式儲存、向量化執行
DuckDB 最大的優勢是可以直接查詢 CSV、Parquet、JSON 甚至 Pandas DataFrame,完全不需要先載入資料庫。
安裝與快速入門
pip install duckdb如果你使用 uv 套件管理工具,速度更快:uv add duckdb
import duckdb
con = duckdb.connect() # 記憶體內
result = con.execute("SELECT 42 AS answer").fetchall()
print(result) # [(42,)]直接查詢 CSV 和 Parquet 檔案
import duckdb
result = duckdb.sql("""
SELECT category, COUNT(*) as count, AVG(price) as avg_price
FROM 'sales_data.csv'
GROUP BY category
ORDER BY avg_price DESC
""").df() # .df() 回傳 Pandas DataFrame支援 glob pattern 一次查詢多個 Parquet 檔案。DuckDB 會智慧地只讀取需要的欄位(column pruning)和資料列(predicate pushdown)。
與 Pandas 無縫整合
import duckdb, pandas as pd
df = pd.read_csv('large_dataset.csv')
result = duckdb.sql("""
SELECT user_id, COUNT(*) as order_count, SUM(amount) as total
FROM df WHERE created_at >= '2025-01-01'
GROUP BY user_id HAVING total > 1000
""").df()相較於用 Pandas 做複雜分析,DuckDB 的 SQL 更直覺,速度通常快 5-10 倍以上。
DuckDB vs Polars:該如何選擇?
Polars 也是熱門替代方案。DuckDB 更適合 SQL 工作流程和查詢外部檔案;Polars 更適合 Python/DataFrame API 鏈式轉換。實務上兩者可以混用。
實戰範例:分析電商銷售資料
import duckdb
con = duckdb.connect()
# 月銷售趨勢
monthly = con.sql("""
SELECT strftime(order_date, '%Y-%m') AS month, category,
COUNT(DISTINCT order_id) AS orders, SUM(quantity * unit_price) AS revenue
FROM 'ecommerce_2025.csv'
WHERE order_status = 'completed'
GROUP BY month, category ORDER BY month, revenue DESC
""").df()
# 每月 TOP 3
top = con.sql("""
WITH stats AS (
SELECT strftime(order_date, '%Y-%m') AS month, category,
SUM(quantity * unit_price) AS revenue,
ROW_NUMBER() OVER (PARTITION BY strftime(order_date, '%Y-%m') ORDER BY SUM(quantity * unit_price) DESC) AS rank
FROM 'ecommerce_2025.csv' WHERE order_status = 'completed'
GROUP BY month, category
) SELECT * FROM stats WHERE rank <= 3
""").df()即使 2GB CSV 也能在幾秒內完成。
建立持久化分析資料庫
con = duckdb.connect('my_analytics.db')
con.execute("CREATE TABLE IF NOT EXISTS sales AS SELECT * FROM 'ecommerce_2025.csv'")
con.execute("CREATE INDEX idx_date ON sales(order_date)")實用技巧與最佳實踐
- 優先使用 Parquet:列式儲存,讀取更快、檔案更小
- 用 COPY TO 匯出:COPY (SELECT ...) TO 'result.parquet'
- 善用 .df() 和 .pl():無縫接軌 Pandas 或 Polars
- 多執行緒自動開啟:DuckDB 預設利用所有 CPU 核心
結語:什麼時候該用 DuckDB?
最適合場景:本地快速分析 GB 級 CSV/Parquet、習慣 SQL 語法、不想架設重型資料庫但需要 OLAP 能力。現在就試試 pip install duckdb 開始你的第一個查詢吧!
繼續閱讀
Python Matplotlib 資料視覺化入門教學:用圖表說故事的完整指南
資料分析做完了,但老闆看不懂你的數字?Matplotlib 是 Python 最經典的繪圖套件,這篇教你從零畫出各種圖表,讓數據自己說話。
相關文章
你可能也喜歡
探索其他領域的精選好文