Re: fix cost subqueryscan wrong parallel cost - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: fix cost subqueryscan wrong parallel cost |
Date | |
Msg-id | 440376.1651261083@sss.pgh.pa.us Whole thread Raw |
In response to | Re: fix cost subqueryscan wrong parallel cost (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: fix cost subqueryscan wrong parallel cost
|
List | pgsql-hackers |
I wrote: > So perhaps we should do it more like the attached, which produces > this plan for the UNION case: sigh ... actually attached this time. regards, tom lane diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index b787c6f81a..18749e842d 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -1395,6 +1395,7 @@ cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, { Cost startup_cost; Cost run_cost; + List *qpquals; QualCost qpqual_cost; Cost cpu_per_tuple; @@ -1402,11 +1403,24 @@ cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, Assert(baserel->relid > 0); Assert(baserel->rtekind == RTE_SUBQUERY); - /* Mark the path with the correct row estimate */ + /* + * We compute the rowcount estimate as the subplan's estimate times the + * selectivity of relevant restriction clauses. In simple cases this will + * come out the same as baserel->rows; but when dealing with parallelized + * paths we must do it like this to get the right answer. + */ if (param_info) - path->path.rows = param_info->ppi_rows; + qpquals = list_concat_copy(param_info->ppi_clauses, + baserel->baserestrictinfo); else - path->path.rows = baserel->rows; + qpquals = baserel->baserestrictinfo; + + path->path.rows = clamp_row_est(path->subpath->rows * + clauselist_selectivity(root, + qpquals, + 0, + JOIN_INNER, + NULL)); /* * Cost of path is cost of evaluating the subplan, plus cost of evaluating diff --git a/src/test/regress/expected/incremental_sort.out b/src/test/regress/expected/incremental_sort.out index 21c429226f..0d8d77140a 100644 --- a/src/test/regress/expected/incremental_sort.out +++ b/src/test/regress/expected/incremental_sort.out @@ -1487,14 +1487,12 @@ explain (costs off) select * from t union select * from t order by 1,3; -> Unique -> Sort Sort Key: t.a, t.b, t.c - -> Append - -> Gather - Workers Planned: 2 + -> Gather + Workers Planned: 2 + -> Parallel Append -> Parallel Seq Scan on t - -> Gather - Workers Planned: 2 -> Parallel Seq Scan on t t_1 -(13 rows) +(11 rows) -- Full sort, not just incremental sort can be pushed below a gather merge path -- by generate_useful_gather_paths.
pgsql-hackers by date: