From d1ec19a46a480b0c75f9df468b2765ad4e51dce2 Mon Sep 17 00:00:00 2001 From: David Rowley Date: Tue, 3 Sep 2024 14:05:30 +1200 Subject: [PATCH v3 5/5] Try a larger CompactAttribute struct without flags Benchmarks have shown that making the CompactAttribute struct larger and getting rid of the flags to reduce the bitwise-ANDing requirements makes things go faster. --- src/backend/access/common/tupdesc.c | 21 ++++++---------- src/include/access/tupdesc.h | 39 ++++++++++------------------- 2 files changed, 20 insertions(+), 40 deletions(-) diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 74f22cffb9..95c92e6585 100644 --- a/src/backend/access/common/tupdesc.c +++ b/src/backend/access/common/tupdesc.c @@ -67,20 +67,13 @@ populate_compact_attribute(TupleDesc tupdesc, int i) dst->attcacheoff = -1; dst->attlen = src->attlen; - dst->attflags = 0; - - if (src->attbyval) - dst->attflags |= COMPACT_ATTR_FLAG_BYVAL; - if (src->attstorage != TYPSTORAGE_PLAIN) - dst->attflags |= COMPACT_ATTR_FLAG_IS_PACKABLE; - if (src->atthasmissing) - dst->attflags |= COMPACT_ATTR_FLAG_HAS_MISSING; - if (src->attisdropped) - dst->attflags |= COMPACT_ATTR_FLAG_IS_DROPPED; - if (src->attgenerated) - dst->attflags |= COMPACT_ATTR_FLAG_IS_GENERATED; - if (src->attnotnull) - dst->attflags |= COMPACT_ATTR_FLAG_IS_NOTNULL; + + dst->attbyval = src->attbyval; + dst->attispackable = (src->attstorage != TYPSTORAGE_PLAIN); + dst->atthasmissing = src->atthasmissing; + dst->attisdropped = src->attisdropped; + dst->attgenerated = src->attgenerated; + dst->attnotnull = src->attnotnull; switch (src->attalign) { diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h index dc0f64c6d2..7bff43b4f7 100644 --- a/src/include/access/tupdesc.h +++ b/src/include/access/tupdesc.h @@ -55,35 +55,22 @@ typedef struct CompactAttribute int32 attcacheoff; /* fixed offset into tuple, if known, or -1 */ int16 attlen; /* attr len in bytes or -1 = varlen, -2 = * cstring */ - uint8 attflags; /* bit flags for compact storage of bool - * fields */ + bool attbyval; /* as FormData_pg_attribute.attbyval */ + bool attispackable; /* as FormData_pg_attribute.attstorage != + * TYPSTORAGE_PLAIN */ + bool atthasmissing; /* as FormData_pg_attribute.atthasmissing */ + bool attisdropped; /* as FormData_pg_attribute.attisdropped */ + bool attgenerated; /* as FormData_pg_attribute.attgenerated */ + bool attnotnull; /* as FormData_pg_attribute.attnotnull */ uint8 attalignby; /* alignment requirement in bytes */ } CompactAttribute; -#define COMPACT_ATTR_FLAG_BYVAL (1 << 0) -#define COMPACT_ATTR_FLAG_IS_PACKABLE (1 << 1) -#define COMPACT_ATTR_FLAG_HAS_MISSING (1 << 2) -#define COMPACT_ATTR_FLAG_IS_DROPPED (1 << 3) -#define COMPACT_ATTR_FLAG_IS_GENERATED (1 << 4) -#define COMPACT_ATTR_FLAG_IS_NOTNULL (1 << 5) - -#define CompactAttrByVal(att) \ - (((att)->attflags & COMPACT_ATTR_FLAG_BYVAL) != 0) - -#define CompactAttrIsPackable(att) \ - (((att)->attflags & COMPACT_ATTR_FLAG_IS_PACKABLE) != 0) - -#define CompactAttrHasMissing(att) \ - (((att)->attflags & COMPACT_ATTR_FLAG_HAS_MISSING) != 0) - -#define CompactAttrIsDropped(att) \ - (((att)->attflags & COMPACT_ATTR_FLAG_IS_DROPPED) != 0) - -#define CompactAttrIsGenerated(att) \ - (((att)->attflags & COMPACT_ATTR_FLAG_IS_GENERATED) != 0) - -#define CompactAttrIsNotNull(att) \ - (((att)->attflags & COMPACT_ATTR_FLAG_IS_NOTNULL) != 0) +#define CompactAttrByVal(att) ((att)->attbyval) +#define CompactAttrIsPackable(att) ((att)->attispackable) +#define CompactAttrHasMissing(att) ((att)->atthasmissing) +#define CompactAttrIsDropped(att) ((att)->attisdropped) +#define CompactAttrIsGenerated(att) ((att)->attgenerated) +#define CompactAttrIsNotNull(att) ((att)->attnotnull) /* * This struct is passed around within the backend to describe the structure -- 2.43.0