Cơ sở dữ liệu 22/09/2026 5 phút

Phân vùng bảng trong PostgreSQL: range, list, hash — chọn kiểu nào cho dữ liệu nào

PostgreSQL có ba kiểu phân vùng: RANGE theo khoảng (ngày, số) cho dữ liệu thời gian, LIST theo giá trị rời rạc (miền, loại), HASH chia đều theo băm khóa. Đo thật: dòng tự định tuyến vào đúng vùng (RANGE 100k mỗi năm, HASH cân bằng ~100k mỗi vùng), và một truy vấn chỉ quét đúng partition liên quan. Khi nào dùng kiểu nào. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

Partition pruning trong PostgreSQL: bỏ vùng không cần, nhanh gấp 10 lần

Partition pruning là lý do chính để phân vùng: planner bỏ qua các vùng không thể chứa dữ liệu khớp. Đo thật trên bảng 5 triệu dòng 10 vùng: lọc theo khóa phân vùng chỉ quét 1 vùng (19,8 ms), không lọc theo khóa phải quét cả 10 vùng (207 ms) — nhanh gấp 10 lần. Plan-time vs run-time pruning và Subplans Removed. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

Khi nào nên phân vùng PostgreSQL: con dao hai lưỡi, đo trước khi chia

Phân vùng không phải luôn nhanh hơn. Đo thật: cùng 3 triệu dòng, truy vấn khớp khóa phân vùng nhanh gấp 5 lần, nhưng truy vấn point lookup theo cột khác lại chậm gấp 20 lần (phải dò index của cả 50 vùng) cộng planning đắt gấp 7 lần. Khi nào phân vùng đáng, khi nào chỉ thêm phức tạp. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

Partition-wise join và aggregate: xử lý theo từng cặp vùng, và vì sao chúng tắt mặc định

Khi hai bảng phân vùng giống nhau, PostgreSQL có thể join theo từng cặp vùng thay vì gộp cả bảng — hash table nhỏ hơn, song song hóa được. Đo thật: partition-wise join giảm số batch tràn đĩa từ 32 xuống 4; partition-wise aggregate nhanh hơn ~20%. Nhưng cả hai tắt mặc định. Khi nào bật. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

Quản lý partition theo thời gian: DROP thay DELETE, DETACH và DEFAULT partition

Phân vùng theo thời gian cần vòng đời: tạo partition tương lai trước, DEFAULT partition bắt dòng ngoài dải, và dọn dữ liệu cũ. Đo thật: DROP partition xóa cả tháng dữ liệu trong 0,069 giây với 0 dead tuple, còn DELETE tương đương để lại 303 nghìn dead tuple cần VACUUM. DETACH tách partition thành bảng độc lập. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

Index trên bảng phân vùng PostgreSQL: lan xuống, unique phải chứa khóa, và dựng không khóa

Index tạo trên bảng cha phân vùng tự lan xuống mọi partition và partition mới cũng thừa kế. Nhưng unique/primary key BẮT BUỘC chứa khóa phân vùng. Đo thật: unique thiếu khóa phân vùng báo lỗi, duplicate bị chặn ở mức partition, và cách dựng index không khóa dài bằng ON ONLY + CONCURRENTLY + ATTACH. PostgreSQL 16.