mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 22:04:40 +03:00
Consider cheap startup paths in add_paths_to_append_rel
6b94e7a6d
did this for ordered append paths to allow fast startup
MergeAppends, however, nothing was done for the Append case.
Here we adjust add_paths_to_append_rel() to have it build an AppendPath
containing the cheapest startup paths from each of the child relations
when the append rel has "consider_startup" set.
Author: Andy Fan, David Rowley
Discussion: https://www.postgresql.org/message-id/CAKU4AWrXSkUV=Pt-gRxQT7EbfUeNssprGyNsB=5mJibFZ6S3ww@mail.gmail.com
This commit is contained in:
@ -1307,6 +1307,8 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
{
|
{
|
||||||
List *subpaths = NIL;
|
List *subpaths = NIL;
|
||||||
bool subpaths_valid = true;
|
bool subpaths_valid = true;
|
||||||
|
List *startup_subpaths = NIL;
|
||||||
|
bool startup_subpaths_valid = true;
|
||||||
List *partial_subpaths = NIL;
|
List *partial_subpaths = NIL;
|
||||||
List *pa_partial_subpaths = NIL;
|
List *pa_partial_subpaths = NIL;
|
||||||
List *pa_nonpartial_subpaths = NIL;
|
List *pa_nonpartial_subpaths = NIL;
|
||||||
@ -1346,6 +1348,20 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
else
|
else
|
||||||
subpaths_valid = false;
|
subpaths_valid = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When the planner is considering cheap startup plans, we'll also
|
||||||
|
* collect all the cheapest_startup_paths and build an AppendPath
|
||||||
|
* containing those as subpaths.
|
||||||
|
*/
|
||||||
|
if (rel->consider_startup && childrel->pathlist != NIL &&
|
||||||
|
childrel->cheapest_startup_path->param_info == NULL)
|
||||||
|
accumulate_append_subpath(childrel->cheapest_startup_path,
|
||||||
|
&startup_subpaths,
|
||||||
|
NULL);
|
||||||
|
else
|
||||||
|
startup_subpaths_valid = false;
|
||||||
|
|
||||||
|
|
||||||
/* Same idea, but for a partial plan. */
|
/* Same idea, but for a partial plan. */
|
||||||
if (childrel->partial_pathlist != NIL)
|
if (childrel->partial_pathlist != NIL)
|
||||||
{
|
{
|
||||||
@ -1478,6 +1494,11 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
|
|||||||
NIL, NULL, 0, false,
|
NIL, NULL, 0, false,
|
||||||
-1));
|
-1));
|
||||||
|
|
||||||
|
/* build an AppendPath for the cheap startup paths, if valid */
|
||||||
|
if (startup_subpaths_valid)
|
||||||
|
add_path(rel, (Path *) create_append_path(root, rel, startup_subpaths,
|
||||||
|
NIL, NIL, NULL, 0, false, -1));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Consider an append of unordered, unparameterized partial paths. Make
|
* Consider an append of unordered, unparameterized partial paths. Make
|
||||||
* it parallel-aware if possible.
|
* it parallel-aware if possible.
|
||||||
|
@ -1432,3 +1432,24 @@ where (x = 0) or (q1 >= q2 and q1 <= q2);
|
|||||||
4567890123456789 | 4567890123456789 | 1
|
4567890123456789 | 4567890123456789 | 1
|
||||||
(6 rows)
|
(6 rows)
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Test the planner's ability to produce cheap startup plans with Append nodes
|
||||||
|
--
|
||||||
|
-- Ensure we get a Nested Loop join between tenk1 and tenk2
|
||||||
|
explain (costs off)
|
||||||
|
select t1.unique1 from tenk1 t1
|
||||||
|
inner join tenk2 t2 on t1.tenthous = t2.tenthous
|
||||||
|
union all
|
||||||
|
(values(1)) limit 1;
|
||||||
|
QUERY PLAN
|
||||||
|
--------------------------------------------------------
|
||||||
|
Limit
|
||||||
|
-> Append
|
||||||
|
-> Nested Loop
|
||||||
|
Join Filter: (t1.tenthous = t2.tenthous)
|
||||||
|
-> Seq Scan on tenk1 t1
|
||||||
|
-> Materialize
|
||||||
|
-> Seq Scan on tenk2 t2
|
||||||
|
-> Result
|
||||||
|
(8 rows)
|
||||||
|
|
||||||
|
@ -540,3 +540,14 @@ select * from
|
|||||||
union all
|
union all
|
||||||
select *, 1 as x from int8_tbl b) ss
|
select *, 1 as x from int8_tbl b) ss
|
||||||
where (x = 0) or (q1 >= q2 and q1 <= q2);
|
where (x = 0) or (q1 >= q2 and q1 <= q2);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Test the planner's ability to produce cheap startup plans with Append nodes
|
||||||
|
--
|
||||||
|
|
||||||
|
-- Ensure we get a Nested Loop join between tenk1 and tenk2
|
||||||
|
explain (costs off)
|
||||||
|
select t1.unique1 from tenk1 t1
|
||||||
|
inner join tenk2 t2 on t1.tenthous = t2.tenthous
|
||||||
|
union all
|
||||||
|
(values(1)) limit 1;
|
Reference in New Issue
Block a user