0

Trino SQL Bài học 43: Trừu tượng hóa dữ liệu với View và Materialized View

Mục tiêu bài học:

  • Nắm vững khái niệm "Trừu tượng hóa" và "Đóng gói" logic SQL phức tạp.

  • Phân biệt rạch ròi bản chất vật lý giữa View (Khung nhìn logic) và Materialized View (Khung nhìn vật lý).

  • Ứng dụng View như một lớp lá chắn bảo mật (Security Layer) che giấu dữ liệu nhạy cảm (PII).

  • Hiểu cơ chế làm mới (Refresh) của Materialized View để cân bằng giữa Tốc độ và Độ tươi của dữ liệu.

1. View (Logical View): Tấm gương phản chiếu

Trong thực tế, các câu lệnh SQL phân tích thường dài hàng trăm dòng, chứa chằng chịt các JOIN, CTE, và Window Functions. Nếu mỗi lần muốn xem báo cáo, Data Analyst lại phải copy/paste đoạn code đó để chạy thì vô cùng rủi ro và khó bảo trì.

View giải quyết vấn đề này bằng cách lưu trữ toàn bộ câu lệnh SQL phức tạp đó lại và gán cho nó một cái tên.

Bản chất: View KHÔNG LƯU TRỮ DỮ LIỆU. Nó chỉ là một file văn bản chứa đoạn mã SQL (Metadata). Khi bạn SELECT từ một View, Trino Engine sẽ tự động bung đoạn mã SQL gốc ra và thực thi trực tiếp trên các bảng vật lý dưới đáy. Nếu coi Bảng (Table) là Database, thì View hoạt động giống hệt như một API Endpoint trả về dữ liệu realtime.

Cú pháp khởi tạo:

SQL

-- Đóng gói logic tính toán doanh thu phức tạp vào một View
CREATE OR REPLACE VIEW iceberg.reports.daily_sales_view AS
SELECT 
    o.orderdate,
    c.mktsegment,
    SUM(o.totalprice) AS total_revenue
FROM tpch.tiny.orders AS o
JOIN tpch.tiny.customer AS c ON o.custkey = c.custkey
GROUP BY o.orderdate, c.mktsegment;

Từ giờ trở đi, người dùng chỉ cần gọi: SELECT * FROM iceberg.reports.daily_sales_view;

2. Ứng dụng thực chiến: Lớp lá chắn bảo mật (Security Layer)

Thay vì phân quyền phức tạp trên từng cột của bảng gốc, Data Engineer thường cấp quyền cho User đọc một View đã được lọc sẵn dữ liệu. Đây là kỹ thuật che giấu Thông tin định danh cá nhân (PII) cực kỳ hiệu quả.

SQL

CREATE OR REPLACE VIEW iceberg.secure.safe_customer_data AS
SELECT 
    custkey,
    mktsegment,
    -- Che giấu (Masking) số điện thoại, chỉ để lại 4 số cuối
    '***-***-' || SUBSTR(phone, -4) AS masked_phone,
    -- Loại bỏ hoàn toàn cột họ tên thật (Không SELECT cột name)
    acctbal
FROM tpch.tiny.customer;

3. Materialized View (MV): "Redis Cache" của Data Engineering

Logical View rất tiện lợi, nhưng nó có một điểm yếu chí mạng: Hiệu năng. Nếu câu SQL bên trong View mất 30 phút để chạy, thì mỗi lần bạn SELECT từ View đó, bạn vẫn phải đợi đúng 30 phút.

Materialized View (Khung nhìn vật lý) ra đời để khắc phục điều này. Nó lưu câu lệnh SQL, đồng thời chạy luôn câu lệnh đó và ghi kết quả thành các file Parquet vật lý xuống Data Lake.

Lần tới, khi bạn SELECT từ Materialized View, Trino sẽ đọc trực tiếp các file kết quả đã được tính sẵn. Thời gian phản hồi giảm từ 30 phút xuống chỉ còn vài mili-giây. Cơ chế này giống hệt như cách bạn dùng Redis để lưu cache cho các câu query nặng trong Backend.

Cú pháp khởi tạo:

SQL

-- Iceberg Connector hỗ trợ Materialized View rất mạnh
CREATE MATERIALIZED VIEW iceberg.reports.mv_monthly_revenue
WITH (
    format = 'PARQUET',
    partitioning = ARRAY['month']
)
AS 
SELECT 
    DATE_TRUNC('month', orderdate) AS month,
    SUM(totalprice) AS revenue
FROM tpch.tiny.orders
GROUP BY 1;

4. Quản trị vòng đời Materialized View (Refresh)

Đánh đổi lại tốc độ chớp nhoáng, Materialized View gặp phải vấn đề kinh điển của Cache: Dữ liệu bị ươn (Stale Data). Khi bảng orders gốc có thêm đơn hàng mới, dữ liệu nằm trong file Parquet của MV sẽ không tự động cập nhật. Bạn phải thiết lập một cơ chế định kỳ (ví dụ: dùng Airflow chạy mỗi đêm) để làm mới (Refresh) lại MV.

SQL

-- Bắt Trino tính toán lại và ghi đè dữ liệu mới vào Materialized View
REFRESH MATERIALIZED VIEW iceberg.reports.mv_monthly_revenue;

5. Bảng quyết định kiến trúc: View hay Materialized View?

Tiêu chí Logical View Materialized View (MV)
Bản chất lưu trữ Chỉ lưu câu lệnh SQL Lưu SQL + File dữ liệu vật lý
Tốc độ truy vấn Bằng đúng thời gian chạy SQL gốc Siêu nhanh (Đọc dữ liệu đã tính sẵn)
Độ tươi (Freshness) Real-time (Luôn lấy dữ liệu mới nhất) Dữ liệu cũ (Cho đến khi được REFRESH)
Chi phí ổ cứng 0 Byte Tốn dung lượng lưu file Parquet
Khi nào nên dùng? Che giấu dữ liệu (Bảo mật), đổi tên cột, logic tính toán nhẹ. Dashboard cho sếp xem cần load nhanh, báo cáo tổng hợp cuối tháng/quý.

Lưu ý cấu hình Engine: Không phải Connector nào của Trino cũng hỗ trợ Materialized View. Hiện tại, Iceberg Connector và Hive Connector có hỗ trợ cơ chế này, nhưng MySQL hay PostgreSQL Connector thì Trino sẽ đẩy việc tạo MV xuống cho CSDL đích xử lý (nếu CSDL đó hỗ trợ).


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí