Materialized View là gì và dùng khi nào? Hướng dẫn đầy đủ từ A-Z
Trong các hệ quản trị cơ sở dữ liệu như PostgreSQL, Oracle hay SQL Server, Materialized View là một công cụ cực kỳ hữu ích để tăng tốc truy vấn phức tạp và giảm tải hệ thống. Vậy Materialized View là gì? Nó khác gì so với View thông thường? Và khi nào nên sử dụng Materialized View? Cùng khám phá chi tiết trong bài viết dưới đây.
✅ Materialized View là gì?#
Materialized View (MV) là một bảng ảo có lưu trữ dữ liệu vật lý được tạo ra từ kết quả của một câu lệnh SQL (thường là SELECT). Khác với View thông thường (chỉ là một câu lệnh SQL được lưu trữ), Materialized View thực sự lưu trữ dữ liệu kết quả tại thời điểm tạo hoặc làm mới.
Tóm gọn:#
View = Câu truy vấn được chạy mỗi khi truy vấn tới.
Materialized View = Kết quả của truy vấn được lưu trữ sẵn như một bảng → truy vấn nhanh hơn.
🔍 Cú pháp tạo Materialized View trong PostgreSQL#
CREATE MATERIALIZED VIEW ten_mv AS SELECT column1, column2 FROM ten_bang WHERE dieu_kien;
Làm mới dữ liệu (Refresh):#
REFRESH MATERIALIZED VIEW ten_mv;
⚡ Khi nào nên dùng Materialized View?#
Dưới đây là các trường hợp điển hình nên sử dụng Materialized View:
| Trường hợp | Lý do |
|---|---|
| ✅ Câu truy vấn phức tạp, chạy lâu | Giúp cache kết quả → tăng tốc |
| ✅ Dữ liệu gốc không thay đổi thường xuyên | MV không tự cập nhật → phù hợp với dữ liệu ít thay đổi |
| ✅ Báo cáo tổng hợp (reporting, BI) | MV có thể dùng để tạo bảng dữ liệu cho dashboard |
| ✅ Tối ưu hiệu suất hệ thống lớn | Giảm tải CPU & IO khi phải chạy lại nhiều truy vấn JOIN, GROUP BY |
| ✅ Tích hợp với hệ thống cache trung gian | MV có thể được làm mới định kỳ để cung cấp dữ liệu cho Redis/API |
📌 Ví dụ: Materialized View tổng doanh thu theo tháng#
Giả sử bạn có bảng don_hang:#
CREATE TABLE don_hang ( id SERIAL PRIMARY KEY, ngay DATE, tong_tien NUMERIC );
Tạo Materialized View:#
CREATE MATERIALIZED VIEW doanh_thu_theo_thang AS SELECT DATE_TRUNC('month', ngay) AS thang, SUM(tong_tien) AS tong_doanh_thu FROM don_hang GROUP BY DATE_TRUNC('month', ngay);
Truy vấn cực nhanh:#
SELECT * FROM doanh_thu_theo_thang;
Làm mới MV khi có dữ liệu mới:#
REFRESH MATERIALIZED VIEW doanh_thu_theo_thang;
🆚 So sánh View và Materialized View#
| Tiêu chí | View | Materialized View |
|---|---|---|
| Lưu dữ liệu | ❌ Không | ✅ Có |
| Tốc độ truy vấn | 🐢 Tùy vào câu lệnh | ⚡ Rất nhanh |
| Dữ liệu cập nhật tự động | ✅ Có | ❌ Không (phải REFRESH) |
| Dùng cho báo cáo | ❌ Không nên | ✅ Rất phù hợp |
| Hỗ trợ index | ❌ Không | ✅ Có thể tạo index |
⚠️ Lưu ý khi sử dụng Materialized View#
MV không tự động cập nhật dữ liệu khi bảng gốc thay đổi.
Bạn cần lên lịch REFRESH (qua
cron job,pgAgenthoặc trigger).Không nên dùng MV nếu dữ liệu gốc thay đổi liên tục.
PostgreSQL hiện chưa hỗ trợ incremental refresh (làm mới từng phần), chỉ hỗ trợ full refresh.
💡 Kết luận#
Materialized View là công cụ cực kỳ hữu ích để cải thiện hiệu suất truy vấn trong cơ sở dữ liệu, đặc biệt trong các hệ thống có yêu cầu về báo cáo, tổng hợp dữ liệu hoặc dashboard. Tuy nhiên, để sử dụng hiệu quả, bạn cần hiểu rõ khi nào nên dùng Materialized View và có chiến lược làm mới dữ liệu phù hợp.