From f28f8e58d3fd4120e4710f5aa9fe4060d064df22 Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Wed, 6 Sep 2023 17:54:19 +0900 Subject: [PATCH v47 8/8] Track opened range table relations in a List in EState This makes ExecCloseRangeTableRelations faster when there are many relations in the range table but only a few are opened during execution, such as when run-time pruning kicks in on an Append containing thousands of partition subplans. Discussion: https://postgr.es/m/CA+HiwqFGkMSge6TgC9KQzde0ohpAycLQuV7ooitEEpbKB0O_mg@mail.gmail.com --- src/backend/executor/execMain.c | 9 +++++---- src/backend/executor/execUtils.c | 2 ++ src/include/nodes/execnodes.h | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 9a3f6c5978..9d88cf30cb 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -1650,12 +1650,13 @@ ExecCloseResultRelations(EState *estate) void ExecCloseRangeTableRelations(EState *estate) { - int i; + ListCell *lc; - for (i = 0; i < estate->es_range_table_size; i++) + foreach(lc, estate->es_opened_relations) { - if (estate->es_relations[i]) - table_close(estate->es_relations[i], NoLock); + Relation rel = lfirst(lc); + + table_close(rel, NoLock); } } diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 94c8e5e875..3d1d467807 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -812,6 +812,8 @@ ExecGetRangeTableRelation(EState *estate, Index rti) } estate->es_relations[rti - 1] = rel; + estate->es_opened_relations = lappend(estate->es_opened_relations, + rel); } return rel; diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 0922be6678..fba1527792 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -619,6 +619,8 @@ typedef struct EState Index es_range_table_size; /* size of the range table arrays */ Relation *es_relations; /* Array of per-range-table-entry Relation * pointers, or NULL if not yet opened */ + List *es_opened_relations; /* List of non-NULL entries in + * es_relations in no specific order */ struct ExecRowMark **es_rowmarks; /* Array of per-range-table-entry * ExecRowMarks, or NULL if none */ List *es_rteperminfos; /* List of RTEPermissionInfo */ -- 2.35.3