pgsql: Introduce CompactAttribute array in TupleDesc

Started by David Rowleyover 1 year ago4 messagescomitters
Jump to latest
#1David Rowley
dgrowleyml@gmail.com

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: /messages/by-id/CAApHDvrBztXP3yx=NKNmo3xwFAFhEdyPnvrDg3=M0RhDs+4vYw@mail.gmail.com
Reviewed-by: Andres Freund, Victor Yegorov

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/d28dff3f6cd6a7562fb2c211ac0fb74a33ffd032

Modified Files
--------------
src/backend/access/common/heaptuple.c | 53 ++++++++++---------
src/backend/access/common/indextuple.c | 26 ++++-----
src/backend/access/common/tupdesc.c | 70 ++++++++++++++++++++----
src/backend/access/spgist/spgutils.c | 4 +-
src/backend/catalog/index.c | 2 +
src/backend/commands/tablecmds.c | 4 ++
src/backend/executor/execTuples.c | 4 +-
src/backend/utils/cache/relcache.c | 21 +++++---
src/backend/utils/cache/typcache.c | 13 +++++
src/include/access/htup_details.h | 4 +-
src/include/access/itup.h | 10 ++--
src/include/access/tupdesc.h | 97 ++++++++++++++++++++++++++++++++--
src/include/access/tupmacs.h | 5 +-
src/tools/pgindent/typedefs.list | 1 +
14 files changed, 246 insertions(+), 68 deletions(-)

#2David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#1)
Re: pgsql: Introduce CompactAttribute array in TupleDesc

On Tue, 3 Dec 2024 at 16:52, David Rowley <drowley@postgresql.org> wrote:

Introduce CompactAttribute array in TupleDesc

I am looking at the buildfarm. It's fairly apparent that I've broken
something. I'm planning on reverting this shortly.

David

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: David Rowley (#2)
Re: pgsql: Introduce CompactAttribute array in TupleDesc

David Rowley <dgrowleyml@gmail.com> writes:

I am looking at the buildfarm. It's fairly apparent that I've broken
something. I'm planning on reverting this shortly.

Just a gut-level guess, but I'm wondering about something like
uninitialized fields that happen to work as long as the memory
was zero to start with. A run under valgrind might offer insight.

regards, tom lane

#4David Rowley
dgrowleyml@gmail.com
In reply to: Tom Lane (#3)
Re: pgsql: Introduce CompactAttribute array in TupleDesc

On Tue, 3 Dec 2024 at 17:55, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Just a gut-level guess, but I'm wondering about something like
uninitialized fields that happen to work as long as the memory
was zero to start with. A run under valgrind might offer insight.

Thanks. I've written about the cause of this in [1]/messages/by-id/CAApHDvq=GXX+f75AqSGX4JGvtCAXydsOWzNdOSnQNjxwtnG-Aw@mail.gmail.com.

David

[1]: /messages/by-id/CAApHDvq=GXX+f75AqSGX4JGvtCAXydsOWzNdOSnQNjxwtnG-Aw@mail.gmail.com