Chuyển tới nội dung chính

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
IDCustomerOrdersTotalAvg
1Emma12$2,400$200
2Liam5$750$150
3Sophia28$8,400$300
4Noah3$270$90
5Olivia15$3,750$250
6James8$1,600$200
7Alice42$12,600$300
8Bob1$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ạnhView 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ệuTự động làm mới (Auto-Refresh)Tăng dần (Incremental)Ghi chú
PostgreSQLThủ công (Manual)Không (xây lại toàn bộ - Full Rebuild)REFRESH MATERIALIZED VIEW
OracleCó (MV Logs)Triển khai trưởng thành nhất
SQL ServerTự động (Live)Không áp dụng"Indexed Views" — yêu cầu Schema-binding
ClickHouseTự động (Auto)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 IndexTạ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ệuKiến thức SQL cơ bản.