Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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);
 
 /*