Thanks. My conclusion on this is the async patch is not the cause of the behavior change mentioned here.
At Mon, 15 Jun 2020 14:59:18 +0500, "Andrey V. Lepikhov" <a.lepik...@postgrespro.ru> wrote in > > Could you tell me how did you get the first plan? > > 1. Use clear current vanilla master. > > 2. Start two instances with the script 'frgn2n.sh' from attachment. > There are I set GUCs: > enable_partitionwise_join = true > enable_partitionwise_aggregate = true > > 3. Execute query: > explain analyze SELECT sum(parts.b) > FROM parts, second > WHERE parts.a = second.a AND second.b < 100; > > That's all. With mater/HEAD, I got the second (local join) plan for a while first then got the first (remote join). The cause of the plan change was found to be autovacuum on the remote node. Before the vacuum the result of remote estimation was as follows. Node2 (remote) =# EXPLAIN SELECT r4.b FROM (public.part_1 r4 INNER JOIN public.second_1 r8 ON (((r4.a = r8.a)) AND ((r8.b < 100)))); QUERY PLAN --------------------------------------------------------------------------- Merge Join (cost=2269.20..3689.70 rows=94449 width=4) Merge Cond: (r8.a = r4.a) -> Sort (cost=74.23..76.11 rows=753 width=4) Sort Key: r8.a -> Seq Scan on second_1 r8 (cost=0.00..38.25 rows=753 width=4) Filter: (b < 100) -> Sort (cost=2194.97..2257.68 rows=25086 width=8) Sort Key: r4.a -> Seq Scan on part_1 r4 (cost=0.00..361.86 rows=25086 width=8) (9 rows) After running a vacuum it changes as follows. QUERY PLAN ------------------------------------------------------------------------ Hash Join (cost=5.90..776.31 rows=9741 width=4) Hash Cond: (r4.a = r8.a) -> Seq Scan on part_1 r4 (cost=0.00..360.78 rows=24978 width=8) -> Hash (cost=4.93..4.93 rows=78 width=4) -> Seq Scan on second_1 r8 (cost=0.00..4.93 rows=78 width=4) Filter: (b < 100) (6 rows) That changes the plan on the local side the way you saw. I saw the exactly same behavior with the async execution patch. regards. FYI, the explain results for another plan changed as follows. It is estimated to return 25839 rows, which is far less than 94449. So local join beated remote join. =# EXPLAIN SELECT a, b FROM public.part_1 ORDER BY a ASC NULLS LAST; QUERY PLAN ------------------------------------------------------------------ Sort (cost=2194.97..2257.68 rows=25086 width=8) Sort Key: a -> Seq Scan on part_1 (cost=0.00..361.86 rows=25086 width=8) (3 rows) =# EXPLAIN SELECT a FROM public.second_1 WHERE ((b < 100)) ORDER BY a ASC NULLS LAST; QUERY PLAN ----------------------------------------------------------------- Sort (cost=74.23..76.11 rows=753 width=4) Sort Key: a -> Seq Scan on second_1 (cost=0.00..38.25 rows=753 width=4) Filter: (b < 100) (4 rows) Are changed to: =# EXPLAIN SELECT a, b FROM public.part_1 ORDER BY a ASC NULLS LAST; QUERY PLAN ------------------------------------------------------------------ Sort (cost=2185.22..2247.66 rows=24978 width=8) Sort Key: a -> Seq Scan on part_1 (cost=0.00..360.78 rows=24978 width=8) (3 rows) horiguti=# EXPLAIN SELECT a FROM public.second_1 WHERE ((b < 100)) ORDER BY a ASC NULLS LAST; QUERY PLAN --------------------------------------------------------------- Sort (cost=7.38..7.57 rows=78 width=4) Sort Key: a -> Seq Scan on second_1 (cost=0.00..4.93 rows=78 width=4) Filter: (b < 100) (4 rows) They return 25056 rows, which is far more than 9741 rows. So remote join won. Of course the number of returning rows is not the only factor of the cost change but is the most significant factor in this case. -- Kyotaro Horiguchi NTT Open Source Software Center