Một tuple của PostgreSQL không được vượt quá một trang 8 KB. TOAST (The Oversized-Attribute Storage Technique) là cơ chế xử lý các giá trị vượt ngưỡng đó.
Khi tổng kích thước dòng vượt khoảng 2 KB, PostgreSQL sẽ nén các cột có kiểu chiều dài thay đổi (text, jsonb, bytea, varchar); nếu vẫn quá lớn thì cắt thành chunk và đẩy sang một TOAST table phụ, dòng gốc chỉ giữ con trỏ.
Chiến lược lưu trữ đặt trên từng cột:
alter table documents alter column body set storage external; -- store out-of-line, no compressionextended(mặc định cho kiểu nén được): nén rồi mới đẩy ra ngoài.external: đẩy ra ngoài, không nén — cho phép đọc một phần nhanh vớisubstring().main: ưu tiên nén và giữ trong dòng.plain: không nén, không đẩy ra ngoài.
Ảnh hưởng hiệu năng:
- SELECT không đụng tới cột lớn thì không phải đọc TOAST table → tránh select * trên bảng có cột lớn.
- Đọc cột đã TOAST tốn thêm lượt truy cập index của TOAST table cộng chi phí giải nén.
- UPDATE một cột nhỏ trong dòng có TOAST không ghi lại phần TOAST nếu cột lớn không đổi.
- Ngược lại, cập nhật jsonb lớn ghi lại toàn bộ document — đây là lý do không nên dồn dữ liệu ghi thường xuyên vào một cột jsonb khổng lồ.