mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
Speed up planner's scanning for parallel-query hazards.
We need to scan the whole parse tree for parallel-unsafe functions. If there are none, we'll later need to determine whether particular subtrees contain any parallel-restricted functions. The previous coding retained no knowledge from the first scan, even though this is very wasteful in the common case where the query contains only parallel-safe functions. We can bypass all of the later scans by remembering that fact. This provides a small but measurable speed improvement when the case applies, and shouldn't cost anything when it doesn't. Patch by me, reviewed by Robert Haas Discussion: <3740.1471538387@sss.pgh.pa.us>
This commit is contained in:
@ -2178,7 +2178,7 @@ create_projection_path(PlannerInfo *root,
|
||||
pathnode->path.parallel_aware = false;
|
||||
pathnode->path.parallel_safe = rel->consider_parallel &&
|
||||
subpath->parallel_safe &&
|
||||
!has_parallel_hazard((Node *) target->exprs, false);
|
||||
is_parallel_safe(root, (Node *) target->exprs);
|
||||
pathnode->path.parallel_workers = subpath->parallel_workers;
|
||||
/* Projection does not change the sort order */
|
||||
pathnode->path.pathkeys = subpath->pathkeys;
|
||||
@ -2285,7 +2285,7 @@ apply_projection_to_path(PlannerInfo *root,
|
||||
* target expressions, then we can't.
|
||||
*/
|
||||
if (IsA(path, GatherPath) &&
|
||||
!has_parallel_hazard((Node *) target->exprs, false))
|
||||
is_parallel_safe(root, (Node *) target->exprs))
|
||||
{
|
||||
GatherPath *gpath = (GatherPath *) path;
|
||||
|
||||
@ -2306,7 +2306,7 @@ apply_projection_to_path(PlannerInfo *root,
|
||||
target);
|
||||
}
|
||||
else if (path->parallel_safe &&
|
||||
has_parallel_hazard((Node *) target->exprs, false))
|
||||
!is_parallel_safe(root, (Node *) target->exprs))
|
||||
{
|
||||
/*
|
||||
* We're inserting a parallel-restricted target list into a path
|
||||
|
Reference in New Issue
Block a user