From: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Subject: Save a few bytes in pg_attribute
Date: Mon, 20 Mar 2023 11:00:12 +0100
Message-ID: <d07ffc2b-e0e8-77f7-38fb-be921dff71af@enterprisedb.com> (raw)
After the discussion in [0] ff., I was looking around in pg_attribute
and noticed that we could possibly save 4 bytes. We could change both
attstattarget and attinhcount from int4 to int2, which together with
some reordering would save 4 bytes from the fixed portion.
attstattarget is already limited to 10000, so this wouldn't lose
anything. For attinhcount, I don't see any documented limits. But it
seems unlikely to me that someone would need more than 32k immediate
inheritance parents on a column. (Maybe an overflow check would be
useful, though, to prevent shenanigans.)
The attached patch seems to work. Thoughts?
[0]:
https://www.postgresql.org/message-id/20230313204119.4mkepdvixcxrwpsc%40awork3.anarazel.deAttachments:0001-Save-a-few-bytes-in-pg_attribute.patch (text/plain, 7.3K) download
From 400f44d18875c40605147c8d81793c6dcc46f8a6 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Mon, 20 Mar 2023 09:51:20 +0100
Subject: [PATCH] Save a few bytes in pg_attribute
attstattarget and attinhcount can be converted to int16 (from int32).
---
doc/src/sgml/catalogs.sgml | 36 +++++++++++++++---------------
src/backend/catalog/heap.c | 4 ++--
src/backend/catalog/index.c | 2 +-
src/include/catalog/pg_attribute.h | 20 ++++++++---------
4 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgmlindex 746baf5053..ad5d15ec49 100644--- a/doc/src/sgml/catalogs.sgml+++ b/doc/src/sgml/catalogs.sgml@@ -1164,23 +1164,6 @@ <title><structname>pg_attribute</structname> Columns</title>
</para></entry>
</row>
- <row>- <entry role="catalog_table_entry"><para role="column_definition">- <structfield>attstattarget</structfield> <type>int4</type>- </para>- <para>- <structfield>attstattarget</structfield> controls the level of detail- of statistics accumulated for this column by- <link linkend="sql-analyze"><command>ANALYZE</command></link>.- A zero value indicates that no statistics should be collected.- A negative value says to use the system default statistics target.- The exact meaning of positive values is data type-dependent.- For scalar data types, <structfield>attstattarget</structfield>- is both the target number of <quote>most common values</quote>- to collect, and the target number of histogram bins to create.- </para></entry>- </row>-
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>attlen</structfield> <type>int2</type>
@@ -1362,7 +1345,7 @@ <title><structname>pg_attribute</structname> Columns</title>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
- <structfield>attinhcount</structfield> <type>int4</type>+ <structfield>attinhcount</structfield> <type>int2</type>
</para>
<para>
The number of direct ancestors this column has. A column with a
@@ -1370,6 +1353,23 @@ <title><structname>pg_attribute</structname> Columns</title>
</para></entry>
</row>
+ <row>+ <entry role="catalog_table_entry"><para role="column_definition">+ <structfield>attstattarget</structfield> <type>int2</type>+ </para>+ <para>+ <structfield>attstattarget</structfield> controls the level of detail+ of statistics accumulated for this column by+ <link linkend="sql-analyze"><command>ANALYZE</command></link>.+ A zero value indicates that no statistics should be collected.+ A negative value says to use the system default statistics target.+ The exact meaning of positive values is data type-dependent.+ For scalar data types, <structfield>attstattarget</structfield>+ is both the target number of <quote>most common values</quote>+ to collect, and the target number of histogram bins to create.+ </para></entry>+ </row>+
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>attcollation</structfield> <type>oid</type>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.cindex 4f006820b8..c67dfffa56 100644--- a/src/backend/catalog/heap.c+++ b/src/backend/catalog/heap.c@@ -732,7 +732,6 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
slot[slotCount]->tts_values[Anum_pg_attribute_attname - 1] = NameGetDatum(&attrs->attname);
slot[slotCount]->tts_values[Anum_pg_attribute_atttypid - 1] = ObjectIdGetDatum(attrs->atttypid);
- slot[slotCount]->tts_values[Anum_pg_attribute_attstattarget - 1] = Int32GetDatum(attrs->attstattarget);
slot[slotCount]->tts_values[Anum_pg_attribute_attlen - 1] = Int16GetDatum(attrs->attlen);
slot[slotCount]->tts_values[Anum_pg_attribute_attnum - 1] = Int16GetDatum(attrs->attnum);
slot[slotCount]->tts_values[Anum_pg_attribute_attndims - 1] = Int32GetDatum(attrs->attndims);
@@ -749,7 +748,8 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
slot[slotCount]->tts_values[Anum_pg_attribute_attgenerated - 1] = CharGetDatum(attrs->attgenerated);
slot[slotCount]->tts_values[Anum_pg_attribute_attisdropped - 1] = BoolGetDatum(attrs->attisdropped);
slot[slotCount]->tts_values[Anum_pg_attribute_attislocal - 1] = BoolGetDatum(attrs->attislocal);
- slot[slotCount]->tts_values[Anum_pg_attribute_attinhcount - 1] = Int32GetDatum(attrs->attinhcount);+ slot[slotCount]->tts_values[Anum_pg_attribute_attinhcount - 1] = Int16GetDatum(attrs->attinhcount);+ slot[slotCount]->tts_values[Anum_pg_attribute_attstattarget - 1] = Int16GetDatum(attrs->attstattarget);
slot[slotCount]->tts_values[Anum_pg_attribute_attcollation - 1] = ObjectIdGetDatum(attrs->attcollation);
if (attoptions && attoptions[natts] != (Datum) 0)
slot[slotCount]->tts_values[Anum_pg_attribute_attoptions - 1] = attoptions[natts];
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.cindex 7777e7ec77..bccea1c749 100644--- a/src/backend/catalog/index.c+++ b/src/backend/catalog/index.c@@ -1812,7 +1812,7 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName)
memset(repl_repl, false, sizeof(repl_repl));
repl_repl[Anum_pg_attribute_attstattarget - 1] = true;
- repl_val[Anum_pg_attribute_attstattarget - 1] = Int32GetDatum(attstattarget);+ repl_val[Anum_pg_attribute_attstattarget - 1] = Int16GetDatum(attstattarget);
newTuple = heap_modify_tuple(attrTuple,
RelationGetDescr(pg_attribute),
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.hindex b561e17781..a0d6409036 100644--- a/src/include/catalog/pg_attribute.h+++ b/src/include/catalog/pg_attribute.h@@ -52,15 +52,6 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
*/
Oid atttypid BKI_LOOKUP_OPT(pg_type);
- /*- * attstattarget is the target number of statistics datapoints to collect- * during VACUUM ANALYZE of this column. A zero here indicates that we do- * not wish to collect any stats about this column. A "-1" here indicates- * that no value has been explicitly set for this column, so ANALYZE- * should use the default setting.- */- int32 attstattarget BKI_DEFAULT(-1);-
/*
* attlen is a copy of the typlen field from pg_type for this attribute.
* See atttypid comments above.
@@ -165,7 +156,16 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
bool attislocal BKI_DEFAULT(t);
/* Number of times inherited from direct parent relation(s) */
- int32 attinhcount BKI_DEFAULT(0);+ int16 attinhcount BKI_DEFAULT(0);++ /*+ * attstattarget is the target number of statistics datapoints to collect+ * during VACUUM ANALYZE of this column. A zero here indicates that we do+ * not wish to collect any stats about this column. A "-1" here indicates+ * that no value has been explicitly set for this column, so ANALYZE+ * should use the default setting.+ */+ int16 attstattarget BKI_DEFAULT(-1);
/* attribute's collation, if any */
Oid attcollation BKI_LOOKUP_OPT(pg_collation);
base-commit: 0b51d423e974557e821d890c0a3a49e419a19caa
--
2.39.2
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: peter.eisentraut@enterprisedb.com
Subject: Re: Save a few bytes in pg_attribute
In-Reply-To: <d07ffc2b-e0e8-77f7-38fb-be921dff71af@enterprisedb.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox