diff options
Diffstat (limited to 'src/backend/optimizer/path/joinpath.c')
-rw-r--r-- | src/backend/optimizer/path/joinpath.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index 40eb58341c1..02dd9724924 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -2021,11 +2021,31 @@ consider_parallel_nestloop(PlannerInfo *root, JoinPathExtraData *extra) { JoinType save_jointype = jointype; + Path *inner_cheapest_total = innerrel->cheapest_total_path; + Path *matpath = NULL; ListCell *lc1; if (jointype == JOIN_UNIQUE_INNER) jointype = JOIN_INNER; + /* + * Consider materializing the cheapest inner path, unless: 1) we're doing + * JOIN_UNIQUE_INNER, because in this case we have to unique-ify the + * cheapest inner path, 2) enable_material is off, 3) the cheapest inner + * path is not parallel-safe, 4) the cheapest inner path is parameterized + * by the outer rel, or 5) the cheapest inner path materializes its output + * anyway. + */ + if (save_jointype != JOIN_UNIQUE_INNER && + enable_material && inner_cheapest_total->parallel_safe && + !PATH_PARAM_BY_REL(inner_cheapest_total, outerrel) && + !ExecMaterializesOutput(inner_cheapest_total->pathtype)) + { + matpath = (Path *) + create_material_path(innerrel, inner_cheapest_total); + Assert(matpath->parallel_safe); + } + foreach(lc1, outerrel->partial_pathlist) { Path *outerpath = (Path *) lfirst(lc1); @@ -2082,6 +2102,11 @@ consider_parallel_nestloop(PlannerInfo *root, try_partial_nestloop_path(root, joinrel, outerpath, mpath, pathkeys, jointype, extra); } + + /* Also consider materialized form of the cheapest inner path */ + if (matpath != NULL) + try_partial_nestloop_path(root, joinrel, outerpath, matpath, + pathkeys, jointype, extra); } } |