Le 12/04/2023 à 20:06, Robert Haas a écrit :
There's only one existing test case that visibly changes plan with
these changes.  The new plan is clearly saner-looking than before,
and testing with some data loaded into the table confirms that it
is faster.  I'm not sure if it's worth devising more test cases.
It seems like it would be nice to see one or two additional scenarios
where these changes bring a benefit, with different kinds of plan
shapes.

Hi,

Currently working on illustrating some points in the v17 release notes, I'm trying to come up with a sexier scenario than the test case, but it seems that with a non-trivial InitPlan (2nd explain below), we still have a non-parallel Append node at the top:

SET parallel_setup_cost = 0;
SET parallel_tuple_cost = 0;
SET min_parallel_table_scan_size = 10;

CREATE TABLE foo (a int) PARTITION by LIST(a);

CREATE TABLE foo_0 PARTITION OF foo FOR VALUES IN (0);

CREATE TABLE foo_1 PARTITION OF foo FOR VALUES IN (1);

EXPLAIN (COSTS OFF)
        SELECT * FROM foo WHERE a = (SELECT 2)
        UNION ALL
        SELECT * FROM foo WHERE a = 0;

                     QUERY PLAN
-----------------------------------------------------
 Gather
   Workers Planned: 2
   ->  Parallel Append
         ->  Parallel Append
               InitPlan 1
                 ->  Result
               ->  Parallel Seq Scan on foo_0 foo_1
                     Filter: (a = (InitPlan 1).col1)
               ->  Parallel Seq Scan on foo_1 foo_2
                     Filter: (a = (InitPlan 1).col1)
         ->  Parallel Seq Scan on foo_0 foo_3
               Filter: (a = 0)


EXPLAIN (COSTS OFF)
        SELECT * FROM foo WHERE a = (SELECT max(a) FROM foo)
        UNION ALL
        SELECT * FROM foo WHERE a = 0;

                               QUERY PLAN
------------------------------------------------------------------------
 Append
   ->  Gather
         Workers Planned: 2
         InitPlan 1
           ->  Finalize Aggregate
                 ->  Gather
                       Workers Planned: 2
                       ->  Partial Aggregate
                             ->  Parallel Append
                                   ->  Parallel Seq Scan on foo_0 foo_5
                                   ->  Parallel Seq Scan on foo_1 foo_6
         ->  Parallel Append
               ->  Parallel Seq Scan on foo_0 foo_1
                     Filter: (a = (InitPlan 1).col1)
               ->  Parallel Seq Scan on foo_1 foo_2
                     Filter: (a = (InitPlan 1).col1)
   ->  Gather
         Workers Planned: 1
         ->  Parallel Seq Scan on foo_0 foo_3
               Filter: (a = 0)

Did I miss something?

Best regards,
Frédéric


Reply via email to