Greenplum Database Bài học 17: Multi-level Partitioning & Quản lý vòng đời dữ liệu: Tự động hóa cắt/gộp phân vùng
Ở Bài học 16, chúng ta đã nắm bắt cách sử dụng Range Partitioning để cắt nhỏ bảng theo thời gian (created_at), giúp bộ tối ưu hóa GPORCA loại bỏ hàng loạt phân vùng không liên quan (Partition Elimination). Tuy nhiên, trong các hệ thống Enterprise Data Warehouse quy mô cực lớn (hàng chục Terabyte), việc chỉ phân vùng theo một chiều thời gian đôi khi vẫn chưa đủ tối ưu.
Khi các câu truy vấn phân tích không chỉ lọc theo thời gian mà còn liên tục gom nhóm theo khu vực địa lý hoặc loại hình giao dịch, mô hình Multi-level Partitioning (Phân vùng đa cấp) chính là vũ khí tiếp theo. Đi kèm với đó là chiến lược Data Lifecycle Management (Quản lý vòng đời dữ liệu - DLM) để tự động hóa việc đưa dữ liệu cũ vào kho lưu trữ lạnh (Cold Storage) hoặc xóa bỏ mà không làm gián đoạn hệ thống.
1. Multi-level Partitioning (Phân vùng đa cấp) là gì?
Phân vùng đa cấp là kỹ thuật chia nhỏ một bảng thành các phân vùng cấp 1 (Level 1 Partition), sau đó tiếp tục chia nhỏ mỗi phân vùng cấp 1 thành các phân vùng con ở cấp 2 (Level 2 Subpartition).
┌────────────────────────────────────────────────────────────────────────┐
│ MULTI-LEVEL PARTITIONING ARCHITECTURE │
└───────────────────────────────────┬────────────────────────────────────┘
│
[ Bảng Gốc: fact_orders ]
│
(Cấp 1: Phân vùng theo RANGE Thời gian)
├──────────────────────┐
▼ ▼
[ Phân vùng 2026 ] [ Phân vùng 2025 ]
│
(Cấp 2: Subpartition theo LIST Khu vực)
┌───────────┴───────────┐
▼ ▼
[ Sub: Miền Nam ] [ Sub: Miền Bắc ]
1.1. Kết hợp kinh điển: Range kết hợp List Partitioning
-
Cấp 1 (Range): Phân vùng theo khoảng thời gian (
created_attheo từng Tháng/Quý). -
Cấp 2 (List): Phân vùng con bên trong mỗi tháng theo khu vực kinh doanh (
region_codenhưSG,HN,DN) hoặc loại hình thanh toán (COD,ONLINE,MOMO).
2. Cú pháp thực chiến: Thiết kế bảng Phân vùng đa cấp (Range + List)
Hãy xem cách hiện thực hóa một bảng giao dịch phân vùng 2 cấp trên Greenplum:
SQL
CREATE TABLE fact_orders_multilevel (
order_id BIGINT,
user_id BIGINT,
region_code VARCHAR(10),
total_amount NUMERIC(12,2),
created_at TIMESTAMP
)
WITH (appendoptimized=true, orientation=column, compresstype=zstd)
DISTRIBUTED BY (user_id)
-- Cấp 1: Phân vùng theo khoảng thời gian (Range theo Tháng)
PARTITION BY RANGE (created_at)
SUBPARTITION BY LIST (region_code) -- Cấp 2: Subpartition theo Khu vực (List)
(
START (DATE '2026-01-01') END (DATE '2026-04-01') EVERY (INTERVAL '1 month')
(
SUBPARTITION sg VALUES ('SG'),
SUBPARTITION hn VALUES ('HN'),
SUBPARTITION other VALUES (DEFAULT)
)
);
Điểm lợi thế tuyệt đối:
Khi câu truy vấn của bạn có dạng:
SQL
SELECT SUM(total_amount)
FROM fact_orders_multilevel
WHERE created_at >= '2026-02-01' AND created_at < '2026-03-01'
AND region_code = 'SG';
Hệ thống sẽ thực hiện Two-dimensional Partition Elimination: Bỏ qua toàn bộ các tháng khác ngoài tháng 2, và bên trong tháng 2, nó tiếp tục bỏ qua luôn các subpartition của HN và other, chỉ mở đúng file dữ liệu của phân vùng [Tháng 2 + Miền SG] trên đĩa. Tốc độ đọc đạt mức tối ưu tuyệt đối!
⚠️ Cảnh báo từ chuyên gia (Best Practice): Đừng lạm dụng tạo quá nhiều cấp phân vùng (ví dụ 3 hoặc 4 cấp). Việc tạo hàng chục ngàn subpartition sẽ làm phình to System Catalog trên Master Node, khiến thời gian biên dịch câu truy vấn của GPORCA lâu hơn thời gian thực thi.
3. Data Lifecycle Management (DLM) & Kỹ thuật Exchange Partition
Trong vòng đời của một Data Warehouse, dữ liệu thường được phân loại thành:
-
Hot Data (Dữ liệu nóng): Dữ liệu của vài tháng gần nhất, thường xuyên được truy vấn và cập nhật. Nên lưu trên ổ cứng SSD tốc độ cao, dùng bảng AOCO kết hợp nén vừa phải.
-
Warm Data (Dữ liệu ấm): Dữ liệu từ 1 đến 2 năm trước, tần suất xem ít hơn.
-
Cold Data / Archive (Dữ liệu lạnh): Dữ liệu lịch sử từ 3–5 năm trước, giữ lại chỉ để tuân thủ quy định kiểm toán hoặc báo cáo tổng hợp năm.
Kỹ thuật EXCHANGE PARTITION — Di chuyển dữ liệu không tốn sức
Thay vì phải dùng lệnh INSERT ... SELECT để chuyển hàng chục triệu dòng dữ liệu lịch sử sang bảng lưu trữ lạnh (rất tốn thời gian và sinh rác WAL), Greenplum cung cấp toán tử EXCHANGE PARTITION cho phép đổi chỗ một phân vùng thành một bảng độc lập gần như tức thì:
SQL
-- 1. Tạo một bảng độc lập để chứa dữ liệu lưu trữ lạnh (Archive Table)
CREATE TABLE archive_orders_2024 (LIKE fact_orders_multilevel);
-- 2. Đổi phân vùng tháng của năm 2024 thành bảng lưu trữ lạnh chỉ trong 0.01 giây
ALTER TABLE fact_orders_multilevel
EXCHANGE PARTITION FOR (DATE '2024-01-01')
WITH TABLE archive_orders_2024
INCLUDING INDEXES;
- Bản chất: Greenplum chỉ đơn giản thay đổi con trỏ thư mục siêu dữ liệu (Metadata pointer) trên Master Node. Toàn bộ file dữ liệu của tháng đó được "bốc" ra khỏi bảng chính thành một bảng riêng biệt, sẵn sàng để nén sâu hơn hoặc chuyển sang Object Storage (MinIO/S3 thông qua PXF).
4. Tự động hóa quản lý phân vùng
Đối với các bảng Range Partitioning theo thời gian (Tháng/Ngày), việc cứ cuối mỗi tháng DBA phải ngồi gõ lệnh ALTER TABLE ADD PARTITION thủ công là một ác mộng dễ dẫn đến quên sót, khiến dữ liệu mới sinh ra rơi vào DEFAULT PARTITION và làm giảm hiệu năng.
Giải pháp tự động hóa:
-
Sử dụng cú pháp
EVERYkhi tạo bảng: Như đã thấy ở Bài 16, việc định nghĩaSTART ... END ... EVERY (INTERVAL '1 month')giúp Greenplum tự động sinh trước các phân vùng cho cả một năm tài chính. -
Viết Cronjob / PL/pgSQL Function định kỳ: Xây dựng một stored procedure chạy định kỳ vào ngày cuối tháng để kiểm tra và tự động sinh phân vùng của tháng tiếp theo dựa trên hàm
pg_add_partitionhoặc lệnh độngEXECUTE 'ALTER TABLE ... ADD PARTITION ...'.
Tóm tắt Bài học 17
-
Multi-level Partitioning kết hợp nhiều chiều lọc dữ liệu (Ví dụ: Range theo thời gian + List theo khu vực), giúp tối đa hóa khả năng loại trừ phân vùng (Partition Elimination).
-
Không nên lạm dụng quá nhiều cấp phân vùng để tránh làm quá tải System Catalog trên Master Node.
-
Data Lifecycle Management (DLM) kết hợp câu lệnh
EXCHANGE PARTITIONcho phép dịch chuyển dữ liệu lịch sử sang kho lưu trữ lạnh tức thì mà không cần quét dữ liệu vật lý.
Ở bài học tiếp theo (Bài học 18), chúng ta sẽ khép lại Phần 2 với chủ đề nâng cao: Polymorphic Storage: Kết hợp Hot Data (Heap/SSD) và Cold Data (AOCO/Nén cao) trên cùng một bảng.
All rights reserved