From ba0eed8f13f65d28abfc934ec08b47c9e9ad9dd1 Mon Sep 17 00:00:00 2001 From: Ashutosh Bapat Date: Wed, 24 Jul 2024 11:55:17 +0530 Subject: [PATCH 2/2] Address Richard's comments --- src/backend/optimizer/path/joinrels.c | 12 ++++++++---- src/backend/optimizer/util/relnode.c | 4 ++-- src/include/optimizer/pathnode.h | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index f9ab82a23f..bf4605795a 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -1547,7 +1547,7 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, RelOptInfo *child_joinrel; AppendRelInfo **appinfos; int nappinfos; - Bitmapset *child_relids = NULL; + Relids child_relids; if (joinrel->partbounds_merged) { @@ -1662,8 +1662,7 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, { child_joinrel = build_child_join_rel(root, child_rel1, child_rel2, joinrel, child_restrictlist, - child_sjinfo, appinfos, - nappinfos); + child_sjinfo, nappinfos, appinfos); joinrel->part_rels[cnt_parts] = child_joinrel; joinrel->live_parts = bms_add_member(joinrel->live_parts, cnt_parts); joinrel->all_partrels = bms_add_members(joinrel->all_partrels, @@ -1680,9 +1679,14 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, child_joinrel, child_sjinfo, child_restrictlist); + /* + * When there are thousands of partitions involved, this loop will + * accumulate a lot of memory in objects useful only in this loop. + * Save it. + */ pfree(appinfos); - free_child_join_sjinfo(child_sjinfo); bms_free(child_relids); + free_child_join_sjinfo(child_sjinfo); } } diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 989bee0fa8..971d1c7aae 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -876,13 +876,13 @@ build_join_rel(PlannerInfo *root, * 'restrictlist': list of RestrictInfo nodes that apply to this particular * pair of joinable relations * 'sjinfo': child join's join-type details - * 'appinfos' and 'nappinfos': AppendRelInfo array for child relids + * 'nappinfos' and 'appinfos': AppendRelInfo array for child relids */ RelOptInfo * build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, RelOptInfo *inner_rel, RelOptInfo *parent_joinrel, List *restrictlist, SpecialJoinInfo *sjinfo, - AppendRelInfo **appinfos, int nappinfos) + int nappinfos, AppendRelInfo **appinfos) { RelOptInfo *joinrel = makeNode(RelOptInfo); diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h index 71fda9f2a4..f00bd55f39 100644 --- a/src/include/optimizer/pathnode.h +++ b/src/include/optimizer/pathnode.h @@ -347,6 +347,6 @@ extern RelOptInfo *build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, RelOptInfo *inner_rel, RelOptInfo *parent_joinrel, List *restrictlist, SpecialJoinInfo *sjinfo, - AppendRelInfo **appinfos, int nappinfos); + int nappinfos, AppendRelInfo **appinfos); #endif /* PATHNODE_H */ -- 2.34.1