aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planner.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2016-04-12 16:24:55 -0400
committerRobert Haas <rhaas@postgresql.org>2016-04-12 16:25:55 -0400
commitdeb71fa9713dfe374a74fc58a5d298b5f25da3f5 (patch)
tree8fc5617711af56dc7d4ee346b07fb7164b7a921a /src/backend/optimizer/plan/planner.c
parent46d73e0d65eef19e25bb0d31f1e5c23ff40a3444 (diff)
downloadpostgresql-deb71fa9713dfe374a74fc58a5d298b5f25da3f5.tar.gz
postgresql-deb71fa9713dfe374a74fc58a5d298b5f25da3f5.zip
Fix costing for parallel aggregation.
The original patch kind of ignored the fact that we were doing something different from a costing point of view, but nobody noticed. This patch fixes that oversight. David Rowley
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r--src/backend/optimizer/plan/planner.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 7c1e3d6bbfd..9377550ad67 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -3262,6 +3262,8 @@ create_grouping_paths(PlannerInfo *root,
RelOptInfo *grouped_rel;
PathTarget *partial_grouping_target = NULL;
AggClauseCosts agg_costs;
+ AggClauseCosts agg_partial_costs; /* parallel only */
+ AggClauseCosts agg_final_costs; /* parallel only */
Size hashaggtablesize;
double dNumGroups;
double dNumPartialGroups = 0;
@@ -3346,8 +3348,10 @@ create_grouping_paths(PlannerInfo *root,
MemSet(&agg_costs, 0, sizeof(AggClauseCosts));
if (parse->hasAggs)
{
- count_agg_clauses(root, (Node *) target->exprs, &agg_costs);
- count_agg_clauses(root, parse->havingQual, &agg_costs);
+ count_agg_clauses(root, (Node *) target->exprs, &agg_costs, true,
+ false, false);
+ count_agg_clauses(root, parse->havingQual, &agg_costs, true, false,
+ false);
}
/*
@@ -3422,6 +3426,25 @@ create_grouping_paths(PlannerInfo *root,
NIL,
NIL);
+ /*
+ * Collect statistics about aggregates for estimating costs of
+ * performing aggregation in parallel.
+ */
+ MemSet(&agg_partial_costs, 0, sizeof(AggClauseCosts));
+ MemSet(&agg_final_costs, 0, sizeof(AggClauseCosts));
+ if (parse->hasAggs)
+ {
+ /* partial phase */
+ count_agg_clauses(root, (Node *) partial_grouping_target->exprs,
+ &agg_partial_costs, false, false, true);
+
+ /* final phase */
+ count_agg_clauses(root, (Node *) target->exprs, &agg_final_costs,
+ true, true, true);
+ count_agg_clauses(root, parse->havingQual, &agg_final_costs, true,
+ true, true);
+ }
+
if (can_sort)
{
/* Checked in set_grouped_rel_consider_parallel() */
@@ -3457,7 +3480,7 @@ create_grouping_paths(PlannerInfo *root,
parse->groupClause ? AGG_SORTED : AGG_PLAIN,
parse->groupClause,
NIL,
- &agg_costs,
+ &agg_partial_costs,
dNumPartialGroups,
false,
false,
@@ -3482,7 +3505,7 @@ create_grouping_paths(PlannerInfo *root,
hashaggtablesize =
estimate_hashagg_tablesize(cheapest_partial_path,
- &agg_costs,
+ &agg_partial_costs,
dNumPartialGroups);
/*
@@ -3499,7 +3522,7 @@ create_grouping_paths(PlannerInfo *root,
AGG_HASHED,
parse->groupClause,
NIL,
- &agg_costs,
+ &agg_partial_costs,
dNumPartialGroups,
false,
false,
@@ -3631,7 +3654,7 @@ create_grouping_paths(PlannerInfo *root,
parse->groupClause ? AGG_SORTED : AGG_PLAIN,
parse->groupClause,
(List *) parse->havingQual,
- &agg_costs,
+ &agg_final_costs,
dNumGroups,
true,
true,
@@ -3691,7 +3714,7 @@ create_grouping_paths(PlannerInfo *root,
Path *path = (Path *) linitial(grouped_rel->partial_pathlist);
hashaggtablesize = estimate_hashagg_tablesize(path,
- &agg_costs,
+ &agg_final_costs,
dNumGroups);
if (hashaggtablesize < work_mem * 1024L)
@@ -3713,7 +3736,7 @@ create_grouping_paths(PlannerInfo *root,
AGG_HASHED,
parse->groupClause,
(List *) parse->havingQual,
- &agg_costs,
+ &agg_final_costs,
dNumGroups,
true,
true,