Deduplication (B-tree posting list)
Also called: posting list tuple, _bt_dedup_pass, deduplicate_items
When a B-tree leaf fills up with many rows that share the same key value, deduplication (_bt_dedup_pass() in nbtdedup.c, PG13+) merges them into one posting-list tuple: a single copy of the key plus an array of the heap TIDs that have it. Instead of "key, key, key, key" you store "key → [tid1, tid2, tid3, tid4]".
What this means
When a leaf page fills with many rows that share the same key value, Postgres merges them into one posting-list tuple: the key stored once, followed by an array of the row addresses that carry it. Instead of "key, key, key, key" you store "key -> [tid1, tid2, tid3]". For low-variety columns that shrinks the index a lot and delays splits.
Why it matters operationally
For low-cardinality indexes (booleans, status flags, foreign keys with few distinct parents) deduplication can shrink the index dramatically and postpone page splits, reducing bloat and I/O. It is on by default (deduplicate_items = on); a REINDEX applies it to an existing index.