diff options
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, |