Cách Materialized View Hoạt động
Materialized View là gì?
Materialized View (MV) là một đối tượng trong cơ sở dữ liệu (Database Object) lưu trữ kết quả của một truy vấn (Query) vật lý trên đĩa (Disk) — khác với View thông thường (Regular View), vốn chỉ là một truy vấn đã lưu (Saved Query) được thực thi lại mỗi lần sử dụng. Hãy coi nó như một bản lưu nhanh (Cached Snapshot) của kết quả truy vấn phức tạp.
Khi nào nên sử dụng Materialized View
| Trường hợp sử dụng (Use Case) | Tại sao MV giúp |
|---|---|
| Bảng điều khiển & báo cáo (Dashboard & Reports) | Tính trước các phép tổng hợp phức tạp (Precompute Aggregations) |
| Kết nối nhiều bảng (Multi-table JOINs) | Lưu trữ kết quả đã kết nối, tránh lặp lại JOIN |
| Kho dữ liệu (Data Warehousing) | Tổng hợp trước các truy vấn Star-schema |
| Xếp hạng & phần trăm (Rankings & Percentiles) | Lưu nhanh các hàm cửa sổ (Window Functions) phức tạp |
Khi nào KHÔNG nên sử dụng
- Hệ thống xử lý giao dịch trực tuyến (OLTP) thời gian thực khi dữ liệu phải luôn cập nhật
- Tập dữ liệu (Dataset) nhỏ khi truy vấn thông thường đã đủ nhanh
- Khi thông lượng ghi (Write Throughput) đã là điểm nghẽn (MV thêm chi phí lưu trữ + làm mới)
Trực quan hóa
Chuyển đổi giữa ba kịch bản để xem toàn bộ vòng đời (Lifecycle):
- Build MV: Xem cách các bảng gốc (Source Tables) được quét (Scan), tổng hợp (Aggregate) và ghi lên đĩa
- So sánh Truy vấn (Query Comparison): Thấy sự khác biệt rõ rệt giữa truy vấn trực tiếp (Live Queries) và đọc từ MV
- Refresh MV: Xem điều gì xảy ra khi dữ liệu gốc thay đổi và MV cần cập nhật
0 / 10
Source Tables (customers + orders)
-- Source data (customers + orders joined)
-- This is what the MV precomputes
| ID | Customer | Orders | Total | Avg |
|---|---|---|---|---|
| 1 | Emma | 12 | $2,400 | $200 |
| 2 | Liam | 5 | $750 | $150 |
| 3 | Sophia | 28 | $8,400 | $300 |
| 4 | Noah | 3 | $270 | $90 |
| 5 | Olivia | 15 | $3,750 | $250 |
| 6 | James | 8 | $1,600 | $200 |
| 7 | Alice | 42 | $12,600 | $300 |
| 8 | Bob | 1 | $45 | $45 |
Materialized View (precomputed)
CREATE MATERIALIZED VIEW mv_customer_summary AS
SELECT c.id, c.name,
COUNT(o.id), SUM(o.amount), AVG(o.amount)
FROM customers c JOIN orders o ...
MV Definition
↓
Scan Sources
↓
Aggregate
↓
Write to Disk
↓
Ready to Query
MV is stale — data not yet computed
Press Play to start building the materialized view...
Các khái niệm chính (Key Concepts)
MV so với View thông thường (Regular View)
| Khía cạnh | View thông thường (Regular View) | Materialized View |
|---|---|---|
| Bộ nhớ (Storage) | Ảo - không lưu trữ (Virtual) | Lưu trữ vật lý trên đĩa (Physical Disk Storage) |
| Tốc độ đọc (Read Speed) | Chậm (tính toán lại - Recomputes) | Nhanh (đã tính trước - Precomputed) |
| Độ mới của dữ liệu (Data Freshness) | Luôn cập nhật (Current) | Cũ cho đến khi làm mới (Stale until Refresh) |
| Chi phí ghi (Write Overhead) | Không có | Thêm chi phí lưu trữ + làm mới |
Chiến lược làm mới (Refresh Strategies)
Hỗ trợ theo Cơ sở dữ liệu (Database Support)
| Cơ sở dữ liệu | Tự động làm mới (Auto-Refresh) | Tăng dần (Incremental) | Ghi chú |
|---|---|---|---|
| PostgreSQL | Thủ công (Manual) | Không (xây lại toàn bộ - Full Rebuild) | REFRESH MATERIALIZED VIEW |
| Oracle | Có | Có (MV Logs) | Triển khai trưởng thành nhất |
| SQL Server | Tự động (Live) | Không áp dụng | "Indexed Views" — yêu cầu Schema-binding |
| ClickHouse | Tự động (Auto) | Có | Tính năng cốt lõi cho phân tích thời gian thực |
Các lỗi thường gặp (Common Pitfalls)
| Lỗi thường gặp (Pitfall) | Giải pháp |
|---|---|
| Dữ liệu cũ (Stale Data) | Thiết lập lịch làm mới (Scheduled Refresh) với pg_cron |
| Chi phí xây lại toàn bộ (Full Rebuild Cost) | Sử dụng REFRESH CONCURRENTLY (PostgreSQL) |
| Thiếu Unique Index | Tạo một Unique Index — bắt buộc cho Concurrent Refresh |
| Phình to bộ nhớ (Storage Bloat) | Theo dõi kích thước MV, xóa các View không sử dụng |
Tìm hiểu thêm
Đọc lý thuyết đầy đủ tại Thiết kế Cơ sở dữ liệu và Kiến thức SQL cơ bản.