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

Isolation level trong PostgreSQL: ba mức cô lập và cái giá hiệu năng của chúng

PostgreSQL có ba mức cô lập giao dịch: Read Committed thấy dữ liệu mới nhất mỗi câu, Repeatable Read giữ ảnh chụp nhất quán, Serializable đảm bảo như chạy tuần tự. Đo thật hành vi và chi phí: Read Committed đọc lại thấy 200, Repeatable Read vẫn thấy 100; và Serializable chậm hơn ~21%. Vì sao mức cao cần logic thử lại. PostgreSQL 16.

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

Giao dịch dài giữ bloat: vì sao một tab quên đóng làm phình cả bảng PostgreSQL

Một giao dịch mở lâu giữ xmin horizon, khiến VACUUM không xóa được dead tuple mới hơn nó — kể cả dead tuple do giao dịch khác tạo. Đo thật: bảng phình từ 3,5 MB lên 14 MB với 300k dead tuple không dọn được trong khi một giao dịch REPEATABLE READ còn mở; đóng nó thì VACUUM dọn sạch ngay. Cách tìm thủ phạm và phòng tránh. PostgreSQL 16.

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.