Save calculated transitionSpace in Agg node.
authorJeff Davis <jdavis@postgresql.org>
Thu, 27 Feb 2020 18:46:58 +0000 (10:46 -0800)
committerJeff Davis <jdavis@postgresql.org>
Thu, 27 Feb 2020 19:20:56 +0000 (11:20 -0800)
This will be useful in the upcoming Hash Aggregation work to improve
estimates for hash table sizing.

Discussion: https://postgr.es/m/37091115219dd522fd9ed67333ee8ed1b7e09443.camel%40j-davis.com

src/backend/optimizer/plan/createplan.c
src/backend/optimizer/util/pathnode.c
src/include/nodes/pathnodes.h
src/include/nodes/plannodes.h
src/include/optimizer/planmain.h

index e048d200bb4235c2e26e79b6bb4126fb8f251e5f..fc25908dc6131f2550bfa53269a2995d22c290af 100644 (file)
@@ -1644,6 +1644,7 @@ create_unique_plan(PlannerInfo *root, UniquePath *best_path, int flags)
                                                                 NIL,
                                                                 NIL,
                                                                 best_path->path.rows,
+                                                                0,
                                                                 subplan);
        }
        else
@@ -2096,6 +2097,7 @@ create_agg_plan(PlannerInfo *root, AggPath *best_path)
                                        NIL,
                                        NIL,
                                        best_path->numGroups,
+                                       best_path->transitionSpace,
                                        subplan);
 
        copy_generic_path_info(&plan->plan, (Path *) best_path);
@@ -2257,6 +2259,7 @@ create_groupingsets_plan(PlannerInfo *root, GroupingSetsPath *best_path)
                                                                                 rollup->gsets,
                                                                                 NIL,
                                                                                 rollup->numGroups,
+                                                                                best_path->transitionSpace,
                                                                                 sort_plan);
 
                        /*
@@ -2295,6 +2298,7 @@ create_groupingsets_plan(PlannerInfo *root, GroupingSetsPath *best_path)
                                                rollup->gsets,
                                                chain,
                                                rollup->numGroups,
+                                               best_path->transitionSpace,
                                                subplan);
 
                /* Copy cost data from Path to Plan */
@@ -6192,8 +6196,8 @@ Agg *
 make_agg(List *tlist, List *qual,
                 AggStrategy aggstrategy, AggSplit aggsplit,
                 int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators, Oid *grpCollations,
-                List *groupingSets, List *chain,
-                double dNumGroups, Plan *lefttree)
+                List *groupingSets, List *chain, double dNumGroups,
+                Size transitionSpace, Plan *lefttree)
 {
        Agg                *node = makeNode(Agg);
        Plan       *plan = &node->plan;
@@ -6209,6 +6213,7 @@ make_agg(List *tlist, List *qual,
        node->grpOperators = grpOperators;
        node->grpCollations = grpCollations;
        node->numGroups = numGroups;
+       node->transitionSpace = transitionSpace;
        node->aggParams = NULL;         /* SS_finalize_plan() will fill this */
        node->groupingSets = groupingSets;
        node->chain = chain;
index e6d08aede56d04e5efc05958f63e7c078a7049c4..d9ce51621163c6e387e20ee5210b2edfa244f5bc 100644 (file)
@@ -2949,6 +2949,7 @@ create_agg_path(PlannerInfo *root,
        pathnode->aggstrategy = aggstrategy;
        pathnode->aggsplit = aggsplit;
        pathnode->numGroups = numGroups;
+       pathnode->transitionSpace = aggcosts ? aggcosts->transitionSpace : 0;
        pathnode->groupClause = groupClause;
        pathnode->qual = qual;
 
@@ -3036,6 +3037,7 @@ create_groupingsets_path(PlannerInfo *root,
        pathnode->aggstrategy = aggstrategy;
        pathnode->rollups = rollups;
        pathnode->qual = having_qual;
+       pathnode->transitionSpace = agg_costs ? agg_costs->transitionSpace : 0;
 
        Assert(rollups != NIL);
        Assert(aggstrategy != AGG_PLAIN || list_length(rollups) == 1);
index 3d3be197e0e0615ff23743b0ddf7760d9e70252a..a580c94e32cff8c68053cb53c3a3bc212430a9ed 100644 (file)
@@ -1663,6 +1663,7 @@ typedef struct AggPath
        AggStrategy aggstrategy;        /* basic strategy, see nodes.h */
        AggSplit        aggsplit;               /* agg-splitting mode, see nodes.h */
        double          numGroups;              /* estimated number of groups in input */
+       Size            transitionSpace;        /* for pass-by-ref transition data */
        List       *groupClause;        /* a list of SortGroupClause's */
        List       *qual;                       /* quals (HAVING quals), if any */
 } AggPath;
@@ -1700,6 +1701,7 @@ typedef struct GroupingSetsPath
        AggStrategy aggstrategy;        /* basic strategy */
        List       *rollups;            /* list of RollupData */
        List       *qual;                       /* quals (HAVING quals), if any */
+       Size            transitionSpace;        /* for pass-by-ref transition data */
 } GroupingSetsPath;
 
 /*
index 32c0d87f80ea2f4aca857bbcbb29662947c0a77a..99835ae2e4c27e53dd7cdb57ee1ce35f532fd211 100644 (file)
@@ -813,6 +813,7 @@ typedef struct Agg
        Oid                *grpOperators;       /* equality operators to compare with */
        Oid                *grpCollations;
        long            numGroups;              /* estimated number of groups in input */
+       Size            transitionSpace;        /* for pass-by-ref transition data */
        Bitmapset  *aggParams;          /* IDs of Params used in Aggref inputs */
        /* Note: planner provides numGroups & aggParams only in HASHED/MIXED case */
        List       *groupingSets;       /* grouping sets to use */
index eab486a621499e2becd3370a85b9007b6ac97da6..47812010015e2c5b0facaa31b6f1a9fdcd5b0d4a 100644 (file)
@@ -54,8 +54,8 @@ extern Sort *make_sort_from_sortclauses(List *sortcls, Plan *lefttree);
 extern Agg *make_agg(List *tlist, List *qual,
                                         AggStrategy aggstrategy, AggSplit aggsplit,
                                         int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators, Oid *grpCollations,
-                                        List *groupingSets, List *chain,
-                                        double dNumGroups, Plan *lefttree);
+                                        List *groupingSets, List *chain, double dNumGroups,
+                                        Size transitionSpace, Plan *lefttree);
 extern Limit *make_limit(Plan *lefttree, Node *limitOffset, Node *limitCount);
 
 /*