On 07.09.2025 14:26, Alexander Korotkov wrote:
On Fri, Sep 5, 2025 at 11:45 AM Andrei Lepikhov <[email protected]> wrote:
On 1/9/2025 22:26, Alexander Korotkov wrote:
On Thu, Jul 31, 2025 at 5:20 PM Andrei Lepikhov <[email protected]> wrote:
See this minor correction in the attachment. postgres_fdw tests are
stable now.
I have another idea.  What if we allow MergeAppend paths only when at
least one subpath is preordered.  This trick also allow us to exclude
MergeAppend(Sort) dominating Sort(Append).  I see the regression tests
changes now have much less volume and looks more reasonable.  What do
you think?
I believe a slight mistake has been made with the total_has_ordered /
startup_has_ordered parameters, which has caused unnecessary test
changes in inherit.out (See updated patch in the attachment). Although
not the best test in general (it depends on the autovacuum), it
highlighted the case where a startup-optimal strategy is necessary, even
when a fractional-optimal path is available, which may lead to continue
of the discussion [1].>
Also, do you think get_cheapest_fractional_path_for_pathkeys_ext() and
get_cheapest_path_for_pathkeys_ext() should consider incremental sort?
   The revised patch teaches them to do so.
Following 55a780e9476 [2] it should be considered, of course.
Great, thank you for catching this.  The diff of costs is attached.  I
see the costs now are better or within the fuzz factor.

Hi! I looked at regression test changes but one of them confused me.

Example where the plan shape changed:

EXPLAIN (COSTS OFF)
SELECT t1.a, t2.b
FROM (SELECT * FROM prt1 WHERE a < 450) t1
LEFT JOIN (SELECT * FROM prt2 WHERE b > 250) t2
  ON t1.a = t2.b
WHERE t1.b = 0
ORDER BY t1.a, t2.b;

-- before
                        QUERY PLAN
-----------------------------------------------------------
 Incremental Sort
   Sort Key: prt1.a, prt2.b
   Presorted Key: prt1.a
   ->  Merge Left Join
         Merge Cond: (prt1.a = prt2.b)
         ->  Sort
               Sort Key: prt1.a
               ->  Append
                     ->  Seq Scan on prt1_p1 prt1_1
                           Filter: ((a < 450) AND (b = 0))
                     ->  Seq Scan on prt1_p2 prt1_2
                           Filter: ((a < 450) AND (b = 0))
         ->  Sort
               Sort Key: prt2.b
               ->  Append
                     ->  Seq Scan on prt2_p2 prt2_1
                           Filter: (b > 250)
                     ->  Seq Scan on prt2_p3 prt2_2
                           Filter: (b > 250)
(19 rows)

-- now
                           QUERY PLAN
-----------------------------------------------------------------
 Sort
   Sort Key: prt1.a, prt2.b
   ->  Merge Right Join
         Merge Cond: (prt2.b = prt1.a)
         ->  Append
               ->  Sort
                     Sort Key: prt2_1.b
                     ->  Seq Scan on prt2_p2 prt2_1
                           Filter: (b > 250)
               ->  Sort
                     Sort Key: prt2_2.b
                     ->  Seq Scan on prt2_p3 prt2_2
                           Filter: (b > 250)
         ->  Materialize
               ->  Append
                     ->  Sort
                           Sort Key: prt1_1.a
                           ->  Seq Scan on prt1_p1 prt1_1
                                 Filter: ((a < 450) AND (b = 0))
                     ->  Sort
                           Sort Key: prt1_2.a
                           ->  Seq Scan on prt1_p2 prt1_2
                                 Filter: ((a < 450) AND (b = 0))
(23 rows)

Previously we had incremental sort on (t1.a, t2.b) with prt1.a already presorted; now we sort both t1.a and t2.b after a merge right join. It looks inefficiently or I missed something?

Other tests looked fine for me.



Reply via email to