mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Preparatory refactoring for parallel merge join support.
Extract the logic used by hash_inner_and_outer into a separate function, get_cheapest_parallel_safe_total_inner, so that it can also be used to plan parallel merge joins. Also, add a require_parallel_safe argument to the existing function get_cheapest_path_for_pathkeys, because parallel merge join needs to find the cheapest path for a given set of pathkeys that is parallel-safe, not just the cheapest one overall. Patch by me, reviewed by Dilip Kumar. Discussion: http://postgr.es/m/CA+TgmoYOv+dFK0MWW6366dFj_xTnohQfoBDrHyB7d1oZhrgPjA@mail.gmail.com
This commit is contained in:
@ -936,7 +936,8 @@ generate_mergejoin_paths(PlannerInfo *root,
|
||||
innerpath = get_cheapest_path_for_pathkeys(innerrel->pathlist,
|
||||
trialsortkeys,
|
||||
NULL,
|
||||
TOTAL_COST);
|
||||
TOTAL_COST,
|
||||
false);
|
||||
if (innerpath != NULL &&
|
||||
(cheapest_total_inner == NULL ||
|
||||
compare_path_costs(innerpath, cheapest_total_inner,
|
||||
@ -971,7 +972,8 @@ generate_mergejoin_paths(PlannerInfo *root,
|
||||
innerpath = get_cheapest_path_for_pathkeys(innerrel->pathlist,
|
||||
trialsortkeys,
|
||||
NULL,
|
||||
STARTUP_COST);
|
||||
STARTUP_COST,
|
||||
false);
|
||||
if (innerpath != NULL &&
|
||||
(cheapest_startup_inner == NULL ||
|
||||
compare_path_costs(innerpath, cheapest_startup_inner,
|
||||
@ -1517,21 +1519,8 @@ hash_inner_and_outer(PlannerInfo *root,
|
||||
if (cheapest_total_inner->parallel_safe)
|
||||
cheapest_safe_inner = cheapest_total_inner;
|
||||
else if (save_jointype != JOIN_UNIQUE_INNER)
|
||||
{
|
||||
ListCell *lc;
|
||||
|
||||
foreach(lc, innerrel->pathlist)
|
||||
{
|
||||
Path *innerpath = (Path *) lfirst(lc);
|
||||
|
||||
if (innerpath->parallel_safe &&
|
||||
bms_is_empty(PATH_REQ_OUTER(innerpath)))
|
||||
{
|
||||
cheapest_safe_inner = innerpath;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
cheapest_safe_inner =
|
||||
get_cheapest_parallel_safe_total_inner(innerrel->pathlist);
|
||||
|
||||
if (cheapest_safe_inner != NULL)
|
||||
try_partial_hashjoin_path(root, joinrel,
|
||||
|
Reference in New Issue
Block a user