From fef4457e294bcc6b48a910f148816b2d163905ec Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Wed, 6 Sep 2023 17:54:19 +0900 Subject: [PATCH v48 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 | 3 +++ src/include/nodes/execnodes.h | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 2804ec70f1..d559c1de61 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -1649,12 +1649,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 2b7a08c9ba..1dfef44495 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -822,6 +822,9 @@ ExecGetRangeTableRelation(EState *estate, Index rti) } estate->es_relations[rti - 1] = rel; + if (rel != NULL) + 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 bb5734edb5..8bbe1f6b14 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