diff options
author | Robert Haas <rhaas@postgresql.org> | 2016-04-12 16:24:55 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2016-04-12 16:25:55 -0400 |
commit | deb71fa9713dfe374a74fc58a5d298b5f25da3f5 (patch) | |
tree | 8fc5617711af56dc7d4ee346b07fb7164b7a921a /src/backend/optimizer/plan/planner.c | |
parent | 46d73e0d65eef19e25bb0d31f1e5c23ff40a3444 (diff) | |
download | postgresql-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.c | 39 |
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, |