Introduce CompactAttribute array in TupleDesc
authorDavid Rowley <drowley@postgresql.org>
Tue, 3 Dec 2024 03:50:59 +0000 (16:50 +1300)
committerDavid Rowley <drowley@postgresql.org>
Tue, 3 Dec 2024 03:50:59 +0000 (16:50 +1300)
commitd28dff3f6cd6a7562fb2c211ac0fb74a33ffd032
tree4b7126eba2dcbed5e08714b4ab2d8577058814c3
parente4c8865196f6ad6bb3473bcad1d2ad51147e4513
Introduce CompactAttribute array in TupleDesc

The new compact_attrs array stores a few select fields from
FormData_pg_attribute in a more compact way, using only 16 bytes per
column instead of the 104 bytes that FormData_pg_attribute uses.  Using
CompactAttribute allows performance-critical operations such as tuple
deformation to be performed without looking at the FormData_pg_attribute
element in TupleDesc which means fewer cacheline accesses.  With this
change, NAMEDATALEN could be increased with a much smaller negative impact
on performance.

For some workloads, tuple deformation can be the most CPU intensive part
of processing the query.  Some testing with 16 columns on a table
where the first column is variable length showed around a 10% increase in
transactions per second for an OLAP type query performing aggregation on
the 16th column.  However, in certain cases, the increases were much
higher, up to ~25% on one AMD Zen4 machine.

This also makes pg_attribute.attcacheoff redundant.  A follow-on commit
will remove it, thus shrinking the FormData_pg_attribute struct by 4
bytes.

Author: David Rowley
Discussion: https://postgr.es/m/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
Reviewed-by: Andres Freund, Victor Yegorov
14 files changed:
src/backend/access/common/heaptuple.c
src/backend/access/common/indextuple.c
src/backend/access/common/tupdesc.c
src/backend/access/spgist/spgutils.c
src/backend/catalog/index.c
src/backend/commands/tablecmds.c
src/backend/executor/execTuples.c
src/backend/utils/cache/relcache.c
src/backend/utils/cache/typcache.c
src/include/access/htup_details.h
src/include/access/itup.h
src/include/access/tupdesc.h
src/include/access/tupmacs.h
src/tools/pgindent/typedefs.list