mirror of
https://github.com/postgres/postgres.git
synced 2025-09-08 00:47:37 +03:00
Add optimizer and executor support for parallel index scans.
In combination with 569174f1be
, which
taught the btree AM how to perform parallel index scans, this allows
parallel index scan plans on btree indexes. This infrastructure
should be general enough to support parallel index scans for other
index AMs as well, if someone updates them to support parallel
scans.
Amit Kapila, reviewed and tested by Anastasia Lubennikova, Tushar
Ahuja, and Haribabu Kommi, and me.
This commit is contained in:
@@ -813,7 +813,7 @@ get_index_paths(PlannerInfo *root, RelOptInfo *rel,
|
||||
/*
|
||||
* build_index_paths
|
||||
* Given an index and a set of index clauses for it, construct zero
|
||||
* or more IndexPaths.
|
||||
* or more IndexPaths. It also constructs zero or more partial IndexPaths.
|
||||
*
|
||||
* We return a list of paths because (1) this routine checks some cases
|
||||
* that should cause us to not generate any IndexPath, and (2) in some
|
||||
@@ -1042,8 +1042,41 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel,
|
||||
NoMovementScanDirection,
|
||||
index_only_scan,
|
||||
outer_relids,
|
||||
loop_count);
|
||||
loop_count,
|
||||
false);
|
||||
result = lappend(result, ipath);
|
||||
|
||||
/*
|
||||
* If appropriate, consider parallel index scan. We don't allow
|
||||
* parallel index scan for bitmap or index only scans.
|
||||
*/
|
||||
if (index->amcanparallel && !index_only_scan &&
|
||||
rel->consider_parallel && outer_relids == NULL &&
|
||||
scantype != ST_BITMAPSCAN)
|
||||
{
|
||||
ipath = create_index_path(root, index,
|
||||
index_clauses,
|
||||
clause_columns,
|
||||
orderbyclauses,
|
||||
orderbyclausecols,
|
||||
useful_pathkeys,
|
||||
index_is_ordered ?
|
||||
ForwardScanDirection :
|
||||
NoMovementScanDirection,
|
||||
index_only_scan,
|
||||
outer_relids,
|
||||
loop_count,
|
||||
true);
|
||||
|
||||
/*
|
||||
* if, after costing the path, we find that it's not worth
|
||||
* using parallel workers, just free it.
|
||||
*/
|
||||
if (ipath->path.parallel_workers > 0)
|
||||
add_partial_path(rel, (Path *) ipath);
|
||||
else
|
||||
pfree(ipath);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1066,8 +1099,36 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel,
|
||||
BackwardScanDirection,
|
||||
index_only_scan,
|
||||
outer_relids,
|
||||
loop_count);
|
||||
loop_count,
|
||||
false);
|
||||
result = lappend(result, ipath);
|
||||
|
||||
/* If appropriate, consider parallel index scan */
|
||||
if (index->amcanparallel && !index_only_scan &&
|
||||
rel->consider_parallel && outer_relids == NULL &&
|
||||
scantype != ST_BITMAPSCAN)
|
||||
{
|
||||
ipath = create_index_path(root, index,
|
||||
index_clauses,
|
||||
clause_columns,
|
||||
NIL,
|
||||
NIL,
|
||||
useful_pathkeys,
|
||||
BackwardScanDirection,
|
||||
index_only_scan,
|
||||
outer_relids,
|
||||
loop_count,
|
||||
true);
|
||||
|
||||
/*
|
||||
* if, after costing the path, we find that it's not worth
|
||||
* using parallel workers, just free it.
|
||||
*/
|
||||
if (ipath->path.parallel_workers > 0)
|
||||
add_partial_path(rel, (Path *) ipath);
|
||||
else
|
||||
pfree(ipath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user