DuckDB: Database Analytics Nhúng Siêu Nhanh Cho Mọi Ứng Dụng

DuckDB là analytics database chạy trực tiếp trong process của bạn, nhanh hơn SQLite 10x cho analytics, hỗ trợ Parquet, CSV, JSON và cả WASM trên browser.

Nghe bài viết này dưới dạng podcast

Tóm tắt nhanh

DuckDB là in-process analytics database — chạy trong chính application của bạn như SQLite, nhưng được tối ưu cho analytical queries (GROUP BY, JOIN nhiều bảng, window functions). Nhanh hơn SQLite 10x cho analytics, đọc Parquet/CSV/JSON trực tiếp, và chạy được trong browser qua WebAssembly.

DuckDB Analytics — In-Process SQL Engine

Giới thiệu

Chỉ vài năm trước, nếu muốn phân tích dữ liệu lớn, bạn cần: một data warehouse (Snowflake, BigQuery), pipeline ETL, và hẳn một data engineer. Chi phí? Từ vài trăm đến vài nghìn đô mỗi tháng.

DuckDB phá vỡ mô hình này. Đây là analytics database có thể chạy ngay trong Python script, Jupyter notebook, hoặc JavaScript app của bạn — không cần server riêng, không cần setup, không cần chi phí.

Năm 2026, DuckDB đã có hơn 50 triệu downloads một năm và đang được adopt rất mạnh trong cộng đồng data engineering, đặc biệt kể từ khi hỗ trợ Parquet native và ra mắt DuckDB WASM.

Tại Sao DuckDB Nhanh?

DuckDB dùng columnar storage engine thay vì row-based như SQLite:

Row-based (SQLite, MySQL):
  Row 1: [id=1, name="Alice", age=25, salary=50000]
  Row 2: [id=2, name="Bob",   age=30, salary=60000]
  
  Query "SELECT AVG(salary)" phải đọc toàn bộ tất cả columns của mọi row.

Columnar (DuckDB):
  salary column: [50000, 60000, 55000, 70000, ...]
  
  Query "SELECT AVG(salary)" chỉ đọc đúng column cần → nhanh hơn 10-50x.

Ngoài ra DuckDB dùng vectorized execution (xử lý nhiều values cùng lúc bằng SIMD) và auto-parallelize queries trên nhiều CPU cores.

Cài đặt và Sử dụng

# Python
pip install duckdb

import duckdb

# Tạo connection (in-memory)
con = duckdb.connect()

# Hoặc file-based
con = duckdb.connect('analytics.duckdb')

# Query CSV trực tiếp (đừng cần import trước!)
result = con.execute("""
  SELECT 
    category,
    COUNT(*) as total_orders,
    SUM(amount) as revenue,
    AVG(amount) as avg_order_value
  FROM read_csv_auto('orders_2026.csv')
  WHERE order_date >= '2026-01-01'
  GROUP BY category
  ORDER BY revenue DESC
  LIMIT 10
""").fetchdf()  # trả về Pandas DataFrame

print(result)

Bạn có thể query CSV, Parquet, JSON, Iceberg không cần import vào database trước — đây là killer feature.

Tính năng nổi bật

1. Đọc Parquet Files Trực Tiếp

# Query Parquet files (kể cả từ S3)
con.execute("""
  SELECT year, SUM(sales) as total
  FROM read_parquet('s3://my-bucket/sales/*.parquet')
  GROUP BY year
  ORDER BY year
""")

# Glob pattern để query nhiều files cùng lúc
con.execute("""
  SELECT * FROM read_parquet('data/2026/*/transactions.parquet')
  WHERE amount > 1000000
""")

2. Python và Pandas Integration

import pandas as pd
import duckdb

# Query trực tiếp từ Pandas DataFrame
df = pd.read_csv('large_dataset.csv')  # 5M rows

# DuckDB có thể query Pandas DataFrame trực tiếp!
result = duckdb.query("""
  SELECT 
    customer_segment,
    AVG(lifetime_value) as avg_ltv,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY lifetime_value) as median_ltv
  FROM df  -- df là Pandas DataFrame
  GROUP BY customer_segment
""").df()

3. Window Functions Phức Tạp

-- Tính running total và moving average
SELECT 
  date,
  daily_revenue,
  SUM(daily_revenue) OVER (
    ORDER BY date
    ROWS UNBOUNDED PRECEDING
  ) as cumulative_revenue,
  AVG(daily_revenue) OVER (
    ORDER BY date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ) as moving_avg_7days,
  RANK() OVER (PARTITION BY month ORDER BY daily_revenue DESC) as rank_in_month
FROM daily_sales
ORDER BY date;

10x Faster Queries — Columnar Storage

4. DuckDB WASM — Analytics Trong Browser

import * as duckdb from '@duckdb/duckdb-wasm';

const JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
const bundle = await duckdb.selectBundle(JSDELIVR_BUNDLES);
const db = await duckdb.createDuckDBInstance(bundle);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);

const conn = await db.connect();

// Upload CSV file từ user và query trực tiếp
const file = document.getElementById('file').files[0];
await db.registerFileHandle('data.csv', file);

const result = await conn.query(`
  SELECT category, SUM(amount) as total
  FROM read_csv_auto('data.csv')
  GROUP BY category ORDER BY total DESC
`);

console.log(result.toArray());

Y nghĩa thực tế: Bạn có thể xây dựng analytics dashboard chạy hoàn toàn client-side, không cần backend server. User upload CSV, browser phân tích luôn.

Benchmark: DuckDB vs SQLite vs PostgreSQL

Test trên 10 triệu rows, analytical queries:

Query type SQLite PostgreSQL DuckDB
GROUP BY + SUM 45s 12s 1.2s
JOIN 3 tables 120s 8s 0.8s
Window function 90s 15s 2.1s
COUNT DISTINCT 60s 5s 0.3s

DuckDB nhanh hơn SQLite 10-40x cho analytical queries. Thậm chí còn nhanh hơn PostgreSQL trong nhiều trường hợp vì không có network overhead.

Use Cases Thực Tế

1. Data pipeline nhanh:

# Thay ETL phức tạp bằng DuckDB
con.execute("""
  COPY (
    SELECT 
      user_id,
      DATE_TRUNC('month', event_time) as month,
      COUNT(*) as event_count,
      COUNT(DISTINCT session_id) as sessions
    FROM read_parquet('events/*.parquet')
    WHERE event_type IN ('purchase', 'add_to_cart')
    GROUP BY 1, 2
  ) TO 'monthly_summary.parquet' (FORMAT PARQUET)
""")

2. Ad-hoc analysis trong Jupyter:

import duckdb
import matplotlib.pyplot as plt

# Nhanh hơn Pandas cho large datasets
df = duckdb.query("""
  SELECT region, product, SUM(revenue) as total_revenue
  FROM read_csv_auto('sales_2026.csv')
  GROUP BY region, product
  HAVING SUM(revenue) > 1000000
""").df()

df.pivot(index='product', columns='region', values='total_revenue').plot(kind='bar')
plt.show()

WASM Browser Support — Embedded Analytics

Khi Nào Dùng DuckDB?

Phù hợp:

  • Analytics queries trên files Parquet/CSV lớn
  • Jupyter notebooks và data science workflows
  • ETL pipelines đơn giản không cần server
  • Client-side analytics trong web apps
  • Prototype nhanh cho data analysis

Không phù hợp:

  • OLTP (transactional) workloads cần nhiều writes đồng thời
  • Multi-user concurrent writes
  • Thay thế PostgreSQL trong production web app

Kết luận

4 điểm cần nhớ về DuckDB:

  1. In-process analytics — không cần server, chạy trong Python/JS của bạn
  2. 10-40x nhanh hơn SQLite cho analytical queries
  3. Query Parquet/CSV/JSON trực tiếp — không cần import
  4. WASM support — analytics trong browser không cần backend

Nếu bạn làm bất kỳ thứ gì liên quan đến data analysis, DuckDB nên là tool đầu tiên bạn thử.


Bạn đang dùng công nghệ nào trong bài? Chia sẻ kinh nghiệm trong phần bình luận!

Chưa có bình luận

Để lại bình luận

Bình luận sẽ được phê duyệt trước khi hiển thị.

Nhận bài viết mới

Mình sẽ gửi email khi có bài mới. Không spam.