Internals
TOAST
The Oversized-Attribute Storage Technique: how PostgreSQL stores values too large to fit in a regular 8 KB heap page.
PostgreSQL heap pages are 8 KB. When a row's variable-length value (text, bytea, jsonb, large arrays) won't fit, TOAST kicks in: the value is compressed and/or split into chunks that live in a separate per-table TOAST relation, and the main row keeps only a pointer.
TOAST is automatic and transparent — you don't see it in queries — but it has performance implications. Reading a TOAST'd column requires extra page reads from the TOAST table, and updating any column on a row with TOAST'd data may rewrite chunks. EXPLAIN (BUFFERS) shows TOAST reads in its buffer counters.
Each TOAST table has its own visibility map and needs its own VACUUM. Autovacuum handles this, but a heavily updated wide-text column can produce surprising bloat in the TOAST relation rather than the parent table.