agora inbox for [email protected]help / color / mirror / Atom feed
[PATCH v5 07/12] consistent language: to which 13+ messages / 4 participants [nested] [flat]
* [PATCH v5 07/12] consistent language: to which @ 2019-05-21 00:02 Justin Pryzby <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Justin Pryzby @ 2019-05-21 00:02 UTC (permalink / raw) XXX: should have trailing period in tables? --- doc/src/sgml/monitoring.sgml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index cba36c0..df5df62 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -602,12 +602,12 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser <row> <entry><structfield>datid</structfield></entry> <entry><type>oid</type></entry> - <entry>OID of the database this backend is connected to</entry> + <entry>OID of the database to which this backend is connected</entry> </row> <row> <entry><structfield>datname</structfield></entry> <entry><type>name</type></entry> - <entry>Name of the database this backend is connected to</entry> + <entry>Name of the database to which this backend is connected</entry> </row> <row> <entry><structfield>pid</structfield></entry> @@ -2099,7 +2099,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i <entry><type>text</type></entry> <entry> Host of the <productname>PostgreSQL</productname> instance - this WAL receiver is connected to. This can be a host name, + to which this WAL receiver is connected. This can be a host name, an IP address, or a directory path if the connection is via Unix socket. (The path case can be distinguished because it will always be an absolute path, beginning with <literal>/</literal>.) @@ -2110,7 +2110,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i <entry><type>integer</type></entry> <entry> Port number of the <productname>PostgreSQL</productname> instance - this WAL receiver is connected to. + to which this WAL receiver is connected. </entry> </row> <row> @@ -3375,7 +3375,7 @@ SELECT pg_stat_get_backend_pid(s.backendid) AS pid, <row> <entry><literal><function>pg_stat_get_backend_dbid(integer)</function></literal></entry> <entry><type>oid</type></entry> - <entry>OID of the database this backend is connected to</entry> + <entry>OID of the database to which this backend is connected</entry> </row> <row> -- 2.7.4 --FkmkrVfFsRoUs1wW Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v5-0008-Consistent-language-contains.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v16 1/3] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e28335915..7c3bfde571 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --arayebouu3vhq6bx Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v16-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v13 1/2] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8a08463c2b..b5a99b4edc 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4788,19 +4788,28 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. XXX does this cause other problems? + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --57gotikuhuh4be5c Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v13-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e08ca1c68..7234cb3da6 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --u5bqxbslpyv5rwih Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v17-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e08ca1c68..7234cb3da6 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --u5bqxbslpyv5rwih Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v17-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v14 1/2] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e28335915..7c3bfde571 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --6opfqulj2xnxqhkn Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v14-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e08ca1c68..7234cb3da6 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --u5bqxbslpyv5rwih Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v17-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e28335915..7c3bfde571 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --icqk4nrzalktuh5g Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v15-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid @ 2023-07-12 16:57 Alvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Alvaro Herrera @ 2023-07-12 16:57 UTC (permalink / raw) --- src/backend/utils/cache/relcache.c | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8e28335915..7c3bfde571 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4789,19 +4789,41 @@ RelationGetIndexList(Relation relation) result = lappend_oid(result, index->indexrelid); /* - * Invalid, non-unique, non-immediate or predicate indexes aren't - * interesting for either oid indexes or replication identity indexes, - * so don't check them. + * Non-unique, non-immediate or predicate indexes aren't interesting + * for either oid indexes or replication identity indexes, so don't + * check them. */ - if (!index->indisvalid || !index->indisunique || + if (!index->indisunique || !index->indimmediate || !heap_attisnull(htup, Anum_pg_index_indpred, NULL)) continue; - /* remember primary key index if any */ - if (index->indisprimary) + /* + * Remember primary key index, if any. We do this only if the index + * is valid; but if the table is partitioned, then we do it even if + * it's invalid. + * + * The reason for returning invalid primary keys for foreign tables is + * because of pg_dump of NOT NULL constraints, and the fact that PKs + * remain marked invalid until the partitions' PKs are attached to it. + * If we make rd_pkindex invalid, then the attnotnull flag is reset + * after the PK is created, which causes the ALTER INDEX ATTACH + * PARTITION to fail with 'column ... is not marked NOT NULL'. With + * this, dropconstraint_internal() will believe that the columns must + * not have attnotnull reset, so the PKs-on-partitions can be attached + * correctly, until finally the PK-on-parent is marked valid. + * + * Also, this doesn't harm anything, because rd_pkindex is not a + * "real" index anyway, but a RELKIND_PARTITIONED_INDEX. + */ + if (index->indisprimary && + (index->indisvalid || + relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)) pkeyIndex = index->indexrelid; + if (!index->indisvalid) + continue; + /* remember explicitly chosen replica index */ if (index->indisreplident) candidateIndex = index->indexrelid; -- 2.39.2 --icqk4nrzalktuh5g Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v15-0002-Add-pg_constraint-rows-for-NOT-NULL-constraints.patch" ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v3a] edit comments and stuff @ 2026-01-05 14:26 Álvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Álvaro Herrera @ 2026-01-05 14:26 UTC (permalink / raw) --- src/backend/utils/sort/tuplesort.c | 2 +- src/include/executor/instrument_node.h | 146 ++++++++++++------------- src/include/utils/tuplesort.h | 15 --- 3 files changed, 73 insertions(+), 90 deletions(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 473d31188b8..9e4cd816137 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -200,7 +200,7 @@ struct Tuplesortstate int64 maxSpace; /* maximum amount of space occupied among sort * of groups, either in-memory or on-disk */ bool isMaxSpaceDisk; /* true when maxSpace is value for on-disk - * space, false when its value for in-memory + * space, false when it's value for in-memory * space */ TupSortStatus maxSpaceStatus; /* sort status when maxSpace was reached */ LogicalTapeSet *tapeset; /* logtape.c object for tapes in a temp file */ diff --git a/src/include/executor/instrument_node.h b/src/include/executor/instrument_node.h index 75520008c36..49627eb4a27 100644 --- a/src/include/executor/instrument_node.h +++ b/src/include/executor/instrument_node.h @@ -1,8 +1,12 @@ /*------------------------------------------------------------------------- * * instrument_node.h - * Definitions for node-specific instrumentation + * Definitions for node-specific support for parallel query instrumentation * + * These structs purposely contain no pointers because they are copied + * across processes during parallel query execution. Each worker copies its + * individual information into the container struct at executor shutdown time, + * to allow the leader to display the information in EXPLAIN ANALYZE. * * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -15,32 +19,30 @@ #define INSTRUMENT_NODE_H - /* --------------------- - * per-worker aggregate information + * Instrumentation information for aggregate function execution * --------------------- */ typedef struct AggregateInstrumentation { - Size hash_mem_peak; /* peak hash table memory usage */ - uint64 hash_disk_used; /*kB of disk space used */ - int hash_batches_used; /* batches used during entire execution */ + Size hash_mem_peak; /* peak hash table memory usage */ + uint64 hash_disk_used; /* kB of disk space used */ + int hash_batches_used; /* batches used during entire execution */ } AggregateInstrumentation; -/* ---------------- - * Shared memory container for per-worker aggregate information - * ---------------- +/* + * Shared memory container for per-worker aggregate information */ typedef struct SharedAggInfo { - int num_workers; + int num_workers; AggregateInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedAggInfo; -/* - * Struct for statistics maintained by amgettuple and amgetbitmap - * - * Note: IndexScanInstrumentation can't contain any pointers, since it is - * copied into a SharedIndexScanInstrumentation during parallel scans + + +/* --------------------- + * Instrumentation information for indexscans (amgettuple and amgetbitmap) + * --------------------- */ typedef struct IndexScanInstrumentation { @@ -49,7 +51,7 @@ typedef struct IndexScanInstrumentation } IndexScanInstrumentation; /* - * Struct for every worker's IndexScanInstrumentation, stored in shared memory + * Shared memory container for per-worker information */ typedef struct SharedIndexScanInstrumentation { @@ -57,11 +59,13 @@ typedef struct SharedIndexScanInstrumentation IndexScanInstrumentation winstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedIndexScanInstrumentation; -/* - * BitmapHeapScanInstrumentation information + +/* --------------------- + * Instrumentation information for bitmap heap scans * * exact_pages total number of exact pages retrieved * lossy_pages total number of lossy pages retrieved + * --------------------- */ typedef struct BitmapHeapScanInstrumentation { @@ -70,11 +74,7 @@ typedef struct BitmapHeapScanInstrumentation } BitmapHeapScanInstrumentation; /* - * Instrumentation data for a parallel bitmap heap scan. - * - * A shared memory struct that each parallel worker copies its - * BitmapHeapScanInstrumentation information into at executor shutdown to - * allow the leader to display the information in EXPLAIN ANALYZE. + * Shared memory container for per-worker information */ typedef struct SharedBitmapHeapInstrumentation { @@ -83,25 +83,27 @@ typedef struct SharedBitmapHeapInstrumentation } SharedBitmapHeapInstrumentation; +/* --------------------- + * Instrumentation information for Memoize + * --------------------- + */ typedef struct MemoizeInstrumentation { - uint64 cache_hits; /* number of rescans where we've found the - * scan parameters values to be cached */ - uint64 cache_misses; /* number of rescans where we've not found the - * scan parameters values to be cached */ - uint64 cache_evictions; /* number of cache entries removed due to - * the need to free memory */ - uint64 cache_overflows; /* number of times we've had to bypass the - * cache when filling it due to not being - * able to free enough space to store the - * current scan's tuples */ - uint64 mem_peak; /* peak memory usage in bytes */ - + uint64 cache_hits; /* number of rescans where we've found the + * scan parameters values to be cached */ + uint64 cache_misses; /* number of rescans where we've not found the + * scan parameters values to be cached */ + uint64 cache_evictions; /* number of cache entries removed due to + * the need to free memory */ + uint64 cache_overflows; /* number of times we've had to bypass the + * cache when filling it due to not being + * able to free enough space to store the + * current scan's tuples */ + uint64 mem_peak; /* peak memory usage in bytes */ } MemoizeInstrumentation; -/* ---------------- - * Shared memory container for per-worker memoize information - * ---------------- +/* + * Shared memory container for per-worker memoize information */ typedef struct SharedMemoizeInfo { @@ -110,27 +112,25 @@ typedef struct SharedMemoizeInfo } SharedMemoizeInfo; -/* - * Data structures for reporting sort statistics. Note that - * TuplesortInstrumentation can't contain any pointers because we - * sometimes put it in shared memory. - * - * The parallel-sort infrastructure relies on having a zero TuplesortMethod - * to indicate that a worker never did anything, so we assign zero to - * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be - * OR'ed together to represent a situation where different workers used - * different methods, so we need a separate bit for each one. Keep the - * NUM_TUPLESORTMETHODS constant in sync with the number of bits! +/* --------------------- + * Instrumentation information for Sorts. + * --------------------- */ -#define NUM_TUPLESORTMETHODS 4 - typedef enum { SORT_SPACE_TYPE_DISK, SORT_SPACE_TYPE_MEMORY, } TuplesortSpaceType; +/* + * The parallel-sort infrastructure relies on having a zero TuplesortMethod + * to indicate that a worker never did anything, so we assign zero to + * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be + * OR'ed together to represent a situation where different workers used + * different methods, so we need a separate bit for each one. Keep the + * NUM_TUPLESORTMETHODS constant in sync with the number of bits! + */ typedef enum { SORT_TYPE_STILL_IN_PROGRESS = 0, @@ -139,40 +139,40 @@ typedef enum SORT_TYPE_EXTERNAL_SORT = 1 << 2, SORT_TYPE_EXTERNAL_MERGE = 1 << 3 } TuplesortMethod; +#define NUM_TUPLESORTMETHODS 4 typedef struct TuplesortInstrumentation { - TuplesortMethod sortMethod; /* sort algorithm used */ + TuplesortMethod sortMethod; /* sort algorithm used */ TuplesortSpaceType spaceType; /* type of space spaceUsed represents */ - int64 spaceUsed; /* space consumption, in kB */ + int64 spaceUsed; /* space consumption, in kB */ } TuplesortInstrumentation; -/* ---------------- - * Shared memory container for per-worker sort information - * ---------------- +/* + * Shared memory container for per-worker sort information */ typedef struct SharedSortInfo { - int num_workers; + int num_workers; TuplesortInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedSortInfo; -/* ---------------- - * Values displayed by EXPLAIN ANALYZE - * ---------------- + +/* --------------------- + * Instrumentation information for nodeHash.c + * --------------------- */ typedef struct HashInstrumentation { - int nbuckets; /* number of buckets at end of execution */ - int nbuckets_original; /* planned number of buckets */ - int nbatch; /* number of batches at end of execution */ - int nbatch_original; /* planned number of batches */ - Size space_peak; /* peak memory usage in bytes */ + int nbuckets; /* number of buckets at end of execution */ + int nbuckets_original; /* planned number of buckets */ + int nbatch; /* number of batches at end of execution */ + int nbatch_original; /* planned number of batches */ + Size space_peak; /* peak memory usage in bytes */ } HashInstrumentation; -/* ---------------- - * Shared memory container for per-worker hash information - * ---------------- +/* + * Shared memory container for per-worker information */ typedef struct SharedHashInfo { @@ -180,9 +180,10 @@ typedef struct SharedHashInfo HashInstrumentation hinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedHashInfo; -/* ---------------- + +/* --------------------- * Instrumentation information for IncrementalSort - * ---------------- + * --------------------- */ typedef struct IncrementalSortGroupInfo { @@ -200,10 +201,7 @@ typedef struct IncrementalSortInfo IncrementalSortGroupInfo prefixsortGroupInfo; } IncrementalSortInfo; -/* ---------------- - * Shared memory container for per-worker incremental sort information - * ---------------- - */ +/* Shared memory container for per-worker incremental sort information */ typedef struct SharedIncrementalSortInfo { int num_workers; diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index a7e867f36b8..943a2b7dc93 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -62,21 +62,6 @@ typedef struct SortCoordinateData typedef struct SortCoordinateData *SortCoordinate; -/* - * Data structures for reporting sort statistics. Note that - * TuplesortInstrumentation can't contain any pointers because we - * sometimes put it in shared memory. - * - * The parallel-sort infrastructure relies on having a zero TuplesortMethod - * to indicate that a worker never did anything, so we assign zero to - * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be - * OR'ed together to represent a situation where different workers used - * different methods, so we need a separate bit for each one. Keep the - * NUM_TUPLESORTMETHODS constant in sync with the number of bits! - */ - -#define NUM_TUPLESORTMETHODS 4 - /* Bitwise option flags for tuple sorts */ #define TUPLESORT_NONE 0 -- 2.47.3 --xs5il3t73pzvzpq7-- ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v3a] edit comments and stuff @ 2026-01-05 14:26 Álvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Álvaro Herrera @ 2026-01-05 14:26 UTC (permalink / raw) --- src/backend/utils/sort/tuplesort.c | 2 +- src/include/executor/instrument_node.h | 146 ++++++++++++------------- src/include/utils/tuplesort.h | 15 --- 3 files changed, 73 insertions(+), 90 deletions(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 473d31188b8..9e4cd816137 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -200,7 +200,7 @@ struct Tuplesortstate int64 maxSpace; /* maximum amount of space occupied among sort * of groups, either in-memory or on-disk */ bool isMaxSpaceDisk; /* true when maxSpace is value for on-disk - * space, false when its value for in-memory + * space, false when it's value for in-memory * space */ TupSortStatus maxSpaceStatus; /* sort status when maxSpace was reached */ LogicalTapeSet *tapeset; /* logtape.c object for tapes in a temp file */ diff --git a/src/include/executor/instrument_node.h b/src/include/executor/instrument_node.h index 75520008c36..49627eb4a27 100644 --- a/src/include/executor/instrument_node.h +++ b/src/include/executor/instrument_node.h @@ -1,8 +1,12 @@ /*------------------------------------------------------------------------- * * instrument_node.h - * Definitions for node-specific instrumentation + * Definitions for node-specific support for parallel query instrumentation * + * These structs purposely contain no pointers because they are copied + * across processes during parallel query execution. Each worker copies its + * individual information into the container struct at executor shutdown time, + * to allow the leader to display the information in EXPLAIN ANALYZE. * * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -15,32 +19,30 @@ #define INSTRUMENT_NODE_H - /* --------------------- - * per-worker aggregate information + * Instrumentation information for aggregate function execution * --------------------- */ typedef struct AggregateInstrumentation { - Size hash_mem_peak; /* peak hash table memory usage */ - uint64 hash_disk_used; /*kB of disk space used */ - int hash_batches_used; /* batches used during entire execution */ + Size hash_mem_peak; /* peak hash table memory usage */ + uint64 hash_disk_used; /* kB of disk space used */ + int hash_batches_used; /* batches used during entire execution */ } AggregateInstrumentation; -/* ---------------- - * Shared memory container for per-worker aggregate information - * ---------------- +/* + * Shared memory container for per-worker aggregate information */ typedef struct SharedAggInfo { - int num_workers; + int num_workers; AggregateInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedAggInfo; -/* - * Struct for statistics maintained by amgettuple and amgetbitmap - * - * Note: IndexScanInstrumentation can't contain any pointers, since it is - * copied into a SharedIndexScanInstrumentation during parallel scans + + +/* --------------------- + * Instrumentation information for indexscans (amgettuple and amgetbitmap) + * --------------------- */ typedef struct IndexScanInstrumentation { @@ -49,7 +51,7 @@ typedef struct IndexScanInstrumentation } IndexScanInstrumentation; /* - * Struct for every worker's IndexScanInstrumentation, stored in shared memory + * Shared memory container for per-worker information */ typedef struct SharedIndexScanInstrumentation { @@ -57,11 +59,13 @@ typedef struct SharedIndexScanInstrumentation IndexScanInstrumentation winstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedIndexScanInstrumentation; -/* - * BitmapHeapScanInstrumentation information + +/* --------------------- + * Instrumentation information for bitmap heap scans * * exact_pages total number of exact pages retrieved * lossy_pages total number of lossy pages retrieved + * --------------------- */ typedef struct BitmapHeapScanInstrumentation { @@ -70,11 +74,7 @@ typedef struct BitmapHeapScanInstrumentation } BitmapHeapScanInstrumentation; /* - * Instrumentation data for a parallel bitmap heap scan. - * - * A shared memory struct that each parallel worker copies its - * BitmapHeapScanInstrumentation information into at executor shutdown to - * allow the leader to display the information in EXPLAIN ANALYZE. + * Shared memory container for per-worker information */ typedef struct SharedBitmapHeapInstrumentation { @@ -83,25 +83,27 @@ typedef struct SharedBitmapHeapInstrumentation } SharedBitmapHeapInstrumentation; +/* --------------------- + * Instrumentation information for Memoize + * --------------------- + */ typedef struct MemoizeInstrumentation { - uint64 cache_hits; /* number of rescans where we've found the - * scan parameters values to be cached */ - uint64 cache_misses; /* number of rescans where we've not found the - * scan parameters values to be cached */ - uint64 cache_evictions; /* number of cache entries removed due to - * the need to free memory */ - uint64 cache_overflows; /* number of times we've had to bypass the - * cache when filling it due to not being - * able to free enough space to store the - * current scan's tuples */ - uint64 mem_peak; /* peak memory usage in bytes */ - + uint64 cache_hits; /* number of rescans where we've found the + * scan parameters values to be cached */ + uint64 cache_misses; /* number of rescans where we've not found the + * scan parameters values to be cached */ + uint64 cache_evictions; /* number of cache entries removed due to + * the need to free memory */ + uint64 cache_overflows; /* number of times we've had to bypass the + * cache when filling it due to not being + * able to free enough space to store the + * current scan's tuples */ + uint64 mem_peak; /* peak memory usage in bytes */ } MemoizeInstrumentation; -/* ---------------- - * Shared memory container for per-worker memoize information - * ---------------- +/* + * Shared memory container for per-worker memoize information */ typedef struct SharedMemoizeInfo { @@ -110,27 +112,25 @@ typedef struct SharedMemoizeInfo } SharedMemoizeInfo; -/* - * Data structures for reporting sort statistics. Note that - * TuplesortInstrumentation can't contain any pointers because we - * sometimes put it in shared memory. - * - * The parallel-sort infrastructure relies on having a zero TuplesortMethod - * to indicate that a worker never did anything, so we assign zero to - * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be - * OR'ed together to represent a situation where different workers used - * different methods, so we need a separate bit for each one. Keep the - * NUM_TUPLESORTMETHODS constant in sync with the number of bits! +/* --------------------- + * Instrumentation information for Sorts. + * --------------------- */ -#define NUM_TUPLESORTMETHODS 4 - typedef enum { SORT_SPACE_TYPE_DISK, SORT_SPACE_TYPE_MEMORY, } TuplesortSpaceType; +/* + * The parallel-sort infrastructure relies on having a zero TuplesortMethod + * to indicate that a worker never did anything, so we assign zero to + * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be + * OR'ed together to represent a situation where different workers used + * different methods, so we need a separate bit for each one. Keep the + * NUM_TUPLESORTMETHODS constant in sync with the number of bits! + */ typedef enum { SORT_TYPE_STILL_IN_PROGRESS = 0, @@ -139,40 +139,40 @@ typedef enum SORT_TYPE_EXTERNAL_SORT = 1 << 2, SORT_TYPE_EXTERNAL_MERGE = 1 << 3 } TuplesortMethod; +#define NUM_TUPLESORTMETHODS 4 typedef struct TuplesortInstrumentation { - TuplesortMethod sortMethod; /* sort algorithm used */ + TuplesortMethod sortMethod; /* sort algorithm used */ TuplesortSpaceType spaceType; /* type of space spaceUsed represents */ - int64 spaceUsed; /* space consumption, in kB */ + int64 spaceUsed; /* space consumption, in kB */ } TuplesortInstrumentation; -/* ---------------- - * Shared memory container for per-worker sort information - * ---------------- +/* + * Shared memory container for per-worker sort information */ typedef struct SharedSortInfo { - int num_workers; + int num_workers; TuplesortInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedSortInfo; -/* ---------------- - * Values displayed by EXPLAIN ANALYZE - * ---------------- + +/* --------------------- + * Instrumentation information for nodeHash.c + * --------------------- */ typedef struct HashInstrumentation { - int nbuckets; /* number of buckets at end of execution */ - int nbuckets_original; /* planned number of buckets */ - int nbatch; /* number of batches at end of execution */ - int nbatch_original; /* planned number of batches */ - Size space_peak; /* peak memory usage in bytes */ + int nbuckets; /* number of buckets at end of execution */ + int nbuckets_original; /* planned number of buckets */ + int nbatch; /* number of batches at end of execution */ + int nbatch_original; /* planned number of batches */ + Size space_peak; /* peak memory usage in bytes */ } HashInstrumentation; -/* ---------------- - * Shared memory container for per-worker hash information - * ---------------- +/* + * Shared memory container for per-worker information */ typedef struct SharedHashInfo { @@ -180,9 +180,10 @@ typedef struct SharedHashInfo HashInstrumentation hinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedHashInfo; -/* ---------------- + +/* --------------------- * Instrumentation information for IncrementalSort - * ---------------- + * --------------------- */ typedef struct IncrementalSortGroupInfo { @@ -200,10 +201,7 @@ typedef struct IncrementalSortInfo IncrementalSortGroupInfo prefixsortGroupInfo; } IncrementalSortInfo; -/* ---------------- - * Shared memory container for per-worker incremental sort information - * ---------------- - */ +/* Shared memory container for per-worker incremental sort information */ typedef struct SharedIncrementalSortInfo { int num_workers; diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index a7e867f36b8..943a2b7dc93 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -62,21 +62,6 @@ typedef struct SortCoordinateData typedef struct SortCoordinateData *SortCoordinate; -/* - * Data structures for reporting sort statistics. Note that - * TuplesortInstrumentation can't contain any pointers because we - * sometimes put it in shared memory. - * - * The parallel-sort infrastructure relies on having a zero TuplesortMethod - * to indicate that a worker never did anything, so we assign zero to - * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be - * OR'ed together to represent a situation where different workers used - * different methods, so we need a separate bit for each one. Keep the - * NUM_TUPLESORTMETHODS constant in sync with the number of bits! - */ - -#define NUM_TUPLESORTMETHODS 4 - /* Bitwise option flags for tuple sorts */ #define TUPLESORT_NONE 0 -- 2.47.3 --xs5il3t73pzvzpq7-- ^ permalink raw reply [nested|flat] 13+ messages in thread
* [PATCH v3a] edit comments and stuff @ 2026-01-05 14:26 Álvaro Herrera <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: Álvaro Herrera @ 2026-01-05 14:26 UTC (permalink / raw) --- src/backend/utils/sort/tuplesort.c | 2 +- src/include/executor/instrument_node.h | 146 ++++++++++++------------- src/include/utils/tuplesort.h | 15 --- 3 files changed, 73 insertions(+), 90 deletions(-) diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index 473d31188b8..9e4cd816137 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -200,7 +200,7 @@ struct Tuplesortstate int64 maxSpace; /* maximum amount of space occupied among sort * of groups, either in-memory or on-disk */ bool isMaxSpaceDisk; /* true when maxSpace is value for on-disk - * space, false when its value for in-memory + * space, false when it's value for in-memory * space */ TupSortStatus maxSpaceStatus; /* sort status when maxSpace was reached */ LogicalTapeSet *tapeset; /* logtape.c object for tapes in a temp file */ diff --git a/src/include/executor/instrument_node.h b/src/include/executor/instrument_node.h index 75520008c36..49627eb4a27 100644 --- a/src/include/executor/instrument_node.h +++ b/src/include/executor/instrument_node.h @@ -1,8 +1,12 @@ /*------------------------------------------------------------------------- * * instrument_node.h - * Definitions for node-specific instrumentation + * Definitions for node-specific support for parallel query instrumentation * + * These structs purposely contain no pointers because they are copied + * across processes during parallel query execution. Each worker copies its + * individual information into the container struct at executor shutdown time, + * to allow the leader to display the information in EXPLAIN ANALYZE. * * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California @@ -15,32 +19,30 @@ #define INSTRUMENT_NODE_H - /* --------------------- - * per-worker aggregate information + * Instrumentation information for aggregate function execution * --------------------- */ typedef struct AggregateInstrumentation { - Size hash_mem_peak; /* peak hash table memory usage */ - uint64 hash_disk_used; /*kB of disk space used */ - int hash_batches_used; /* batches used during entire execution */ + Size hash_mem_peak; /* peak hash table memory usage */ + uint64 hash_disk_used; /* kB of disk space used */ + int hash_batches_used; /* batches used during entire execution */ } AggregateInstrumentation; -/* ---------------- - * Shared memory container for per-worker aggregate information - * ---------------- +/* + * Shared memory container for per-worker aggregate information */ typedef struct SharedAggInfo { - int num_workers; + int num_workers; AggregateInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedAggInfo; -/* - * Struct for statistics maintained by amgettuple and amgetbitmap - * - * Note: IndexScanInstrumentation can't contain any pointers, since it is - * copied into a SharedIndexScanInstrumentation during parallel scans + + +/* --------------------- + * Instrumentation information for indexscans (amgettuple and amgetbitmap) + * --------------------- */ typedef struct IndexScanInstrumentation { @@ -49,7 +51,7 @@ typedef struct IndexScanInstrumentation } IndexScanInstrumentation; /* - * Struct for every worker's IndexScanInstrumentation, stored in shared memory + * Shared memory container for per-worker information */ typedef struct SharedIndexScanInstrumentation { @@ -57,11 +59,13 @@ typedef struct SharedIndexScanInstrumentation IndexScanInstrumentation winstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedIndexScanInstrumentation; -/* - * BitmapHeapScanInstrumentation information + +/* --------------------- + * Instrumentation information for bitmap heap scans * * exact_pages total number of exact pages retrieved * lossy_pages total number of lossy pages retrieved + * --------------------- */ typedef struct BitmapHeapScanInstrumentation { @@ -70,11 +74,7 @@ typedef struct BitmapHeapScanInstrumentation } BitmapHeapScanInstrumentation; /* - * Instrumentation data for a parallel bitmap heap scan. - * - * A shared memory struct that each parallel worker copies its - * BitmapHeapScanInstrumentation information into at executor shutdown to - * allow the leader to display the information in EXPLAIN ANALYZE. + * Shared memory container for per-worker information */ typedef struct SharedBitmapHeapInstrumentation { @@ -83,25 +83,27 @@ typedef struct SharedBitmapHeapInstrumentation } SharedBitmapHeapInstrumentation; +/* --------------------- + * Instrumentation information for Memoize + * --------------------- + */ typedef struct MemoizeInstrumentation { - uint64 cache_hits; /* number of rescans where we've found the - * scan parameters values to be cached */ - uint64 cache_misses; /* number of rescans where we've not found the - * scan parameters values to be cached */ - uint64 cache_evictions; /* number of cache entries removed due to - * the need to free memory */ - uint64 cache_overflows; /* number of times we've had to bypass the - * cache when filling it due to not being - * able to free enough space to store the - * current scan's tuples */ - uint64 mem_peak; /* peak memory usage in bytes */ - + uint64 cache_hits; /* number of rescans where we've found the + * scan parameters values to be cached */ + uint64 cache_misses; /* number of rescans where we've not found the + * scan parameters values to be cached */ + uint64 cache_evictions; /* number of cache entries removed due to + * the need to free memory */ + uint64 cache_overflows; /* number of times we've had to bypass the + * cache when filling it due to not being + * able to free enough space to store the + * current scan's tuples */ + uint64 mem_peak; /* peak memory usage in bytes */ } MemoizeInstrumentation; -/* ---------------- - * Shared memory container for per-worker memoize information - * ---------------- +/* + * Shared memory container for per-worker memoize information */ typedef struct SharedMemoizeInfo { @@ -110,27 +112,25 @@ typedef struct SharedMemoizeInfo } SharedMemoizeInfo; -/* - * Data structures for reporting sort statistics. Note that - * TuplesortInstrumentation can't contain any pointers because we - * sometimes put it in shared memory. - * - * The parallel-sort infrastructure relies on having a zero TuplesortMethod - * to indicate that a worker never did anything, so we assign zero to - * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be - * OR'ed together to represent a situation where different workers used - * different methods, so we need a separate bit for each one. Keep the - * NUM_TUPLESORTMETHODS constant in sync with the number of bits! +/* --------------------- + * Instrumentation information for Sorts. + * --------------------- */ -#define NUM_TUPLESORTMETHODS 4 - typedef enum { SORT_SPACE_TYPE_DISK, SORT_SPACE_TYPE_MEMORY, } TuplesortSpaceType; +/* + * The parallel-sort infrastructure relies on having a zero TuplesortMethod + * to indicate that a worker never did anything, so we assign zero to + * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be + * OR'ed together to represent a situation where different workers used + * different methods, so we need a separate bit for each one. Keep the + * NUM_TUPLESORTMETHODS constant in sync with the number of bits! + */ typedef enum { SORT_TYPE_STILL_IN_PROGRESS = 0, @@ -139,40 +139,40 @@ typedef enum SORT_TYPE_EXTERNAL_SORT = 1 << 2, SORT_TYPE_EXTERNAL_MERGE = 1 << 3 } TuplesortMethod; +#define NUM_TUPLESORTMETHODS 4 typedef struct TuplesortInstrumentation { - TuplesortMethod sortMethod; /* sort algorithm used */ + TuplesortMethod sortMethod; /* sort algorithm used */ TuplesortSpaceType spaceType; /* type of space spaceUsed represents */ - int64 spaceUsed; /* space consumption, in kB */ + int64 spaceUsed; /* space consumption, in kB */ } TuplesortInstrumentation; -/* ---------------- - * Shared memory container for per-worker sort information - * ---------------- +/* + * Shared memory container for per-worker sort information */ typedef struct SharedSortInfo { - int num_workers; + int num_workers; TuplesortInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedSortInfo; -/* ---------------- - * Values displayed by EXPLAIN ANALYZE - * ---------------- + +/* --------------------- + * Instrumentation information for nodeHash.c + * --------------------- */ typedef struct HashInstrumentation { - int nbuckets; /* number of buckets at end of execution */ - int nbuckets_original; /* planned number of buckets */ - int nbatch; /* number of batches at end of execution */ - int nbatch_original; /* planned number of batches */ - Size space_peak; /* peak memory usage in bytes */ + int nbuckets; /* number of buckets at end of execution */ + int nbuckets_original; /* planned number of buckets */ + int nbatch; /* number of batches at end of execution */ + int nbatch_original; /* planned number of batches */ + Size space_peak; /* peak memory usage in bytes */ } HashInstrumentation; -/* ---------------- - * Shared memory container for per-worker hash information - * ---------------- +/* + * Shared memory container for per-worker information */ typedef struct SharedHashInfo { @@ -180,9 +180,10 @@ typedef struct SharedHashInfo HashInstrumentation hinstrument[FLEXIBLE_ARRAY_MEMBER]; } SharedHashInfo; -/* ---------------- + +/* --------------------- * Instrumentation information for IncrementalSort - * ---------------- + * --------------------- */ typedef struct IncrementalSortGroupInfo { @@ -200,10 +201,7 @@ typedef struct IncrementalSortInfo IncrementalSortGroupInfo prefixsortGroupInfo; } IncrementalSortInfo; -/* ---------------- - * Shared memory container for per-worker incremental sort information - * ---------------- - */ +/* Shared memory container for per-worker incremental sort information */ typedef struct SharedIncrementalSortInfo { int num_workers; diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index a7e867f36b8..943a2b7dc93 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -62,21 +62,6 @@ typedef struct SortCoordinateData typedef struct SortCoordinateData *SortCoordinate; -/* - * Data structures for reporting sort statistics. Note that - * TuplesortInstrumentation can't contain any pointers because we - * sometimes put it in shared memory. - * - * The parallel-sort infrastructure relies on having a zero TuplesortMethod - * to indicate that a worker never did anything, so we assign zero to - * SORT_TYPE_STILL_IN_PROGRESS. The other values of this enum can be - * OR'ed together to represent a situation where different workers used - * different methods, so we need a separate bit for each one. Keep the - * NUM_TUPLESORTMETHODS constant in sync with the number of bits! - */ - -#define NUM_TUPLESORTMETHODS 4 - /* Bitwise option flags for tuple sorts */ #define TUPLESORT_NONE 0 -- 2.47.3 --xs5il3t73pzvzpq7-- ^ permalink raw reply [nested|flat] 13+ messages in thread
* Re: [PATCH] ANALYZE: hash-accelerate MCV tracking for equality-only types @ 2026-05-04 02:10 John Naylor <[email protected]> 0 siblings, 0 replies; 13+ messages in thread From: John Naylor @ 2026-05-04 02:10 UTC (permalink / raw) To: Ilia Evdokimov <[email protected]>; +Cc: Chengpeng Yan <[email protected]>; Tatsuya Kawata <[email protected]>; pgsql-hackers On Thu, Feb 26, 2026 at 6:46 PM Ilia Evdokimov <[email protected]> wrote: > While reviewing the patch more closely, I noticed > that compute_distinct_stats() is only used for types where we have =, != > but not <. In practice, most common scalar types go through > compute_scalar_stats() instead. > > That makes me wonder how often this optimization would actually trigger > in real workloads. Since compute_scalar_stats() is the more common path, > there's chance that the hash-table based improvement in > compute_distinct_stats() may not provide a noticeable overall benefit. Coming back to this point, in any installation, the common path is going to vastly outnumber the rare path, so this patch is optimizing the wrong thing. -- John Naylor Amazon Web Services ^ permalink raw reply [nested|flat] 13+ messages in thread
end of thread, other threads:[~2026-05-04 02:10 UTC | newest] Thread overview: 13+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2019-05-21 00:02 [PATCH v5 07/12] consistent language: to which Justin Pryzby <[email protected]> 2023-07-12 16:57 [PATCH v16 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v13 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v14 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v17 1/3] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2023-07-12 16:57 [PATCH v15 1/2] Remember PK oid for partitioned tables even when it's invalid Alvaro Herrera <[email protected]> 2026-01-05 14:26 [PATCH v3a] edit comments and stuff Álvaro Herrera <[email protected]> 2026-01-05 14:26 [PATCH v3a] edit comments and stuff Álvaro Herrera <[email protected]> 2026-01-05 14:26 [PATCH v3a] edit comments and stuff Álvaro Herrera <[email protected]> 2026-05-04 02:10 Re: [PATCH] ANALYZE: hash-accelerate MCV tracking for equality-only types John Naylor <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox