mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-21 03:13:05 +08:00
Increase DEFAULT_FDW_TUPLE_COST from 0.01 to 0.2
0.01 was unrealistically low as it's the same as the default cpu_tuple_cost and 10x cheaper than the default parallel_tuple_cost. It's hard to imagine a situation where fetching a tuple from a foreign server would be cheaper than fetching one from a parallel worker. After some experimentation on a loopback server, somewhere between 0.15 and 0.3 seems more realistic. Here we split the difference and set it to 0.2. This will cause operations that reduce the number of tuples (e.g. aggregation) to be more likely to take place on the foreign server. Adjusting this causes some plan changes in the postgres_fdw regression tests. This is because penalizing each Path with the additional tuple costs causes some dilution of the costs of the other operations being charged for and results in various paths appearing to be closer to the same costs such that add_path's STD_FUZZ_FACTOR is more likely to see two paths as costing (fuzzily) the same. This isn't ideal, but it shouldn't be reason enough to use artificially low costs. Discussion: https://postgr.es/m/CAApHDvopVjjfh5c1Ed2HRvDdfom2dEpMwwiu5-f1AnmYprJngA@mail.gmail.com
This commit is contained in:
parent
4210b55f59
commit
cac169d686
@ -9729,21 +9729,19 @@ SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE
|
||||
-- test FOR UPDATE; partitionwise join does not apply
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------
|
||||
LockRows
|
||||
-> Sort
|
||||
Sort Key: t1.a
|
||||
-> Hash Join
|
||||
Hash Cond: (t2.b = t1.a)
|
||||
-> Nested Loop
|
||||
Join Filter: (t1.a = t2.b)
|
||||
-> Append
|
||||
-> Foreign Scan on ftprt1_p1 t1_1
|
||||
-> Foreign Scan on ftprt1_p2 t1_2
|
||||
-> Materialize
|
||||
-> Append
|
||||
-> Foreign Scan on ftprt2_p1 t2_1
|
||||
-> Foreign Scan on ftprt2_p2 t2_2
|
||||
-> Hash
|
||||
-> Append
|
||||
-> Foreign Scan on ftprt1_p1 t1_1
|
||||
-> Foreign Scan on ftprt1_p2 t1_2
|
||||
(12 rows)
|
||||
(10 rows)
|
||||
|
||||
SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1;
|
||||
a | b
|
||||
@ -9778,18 +9776,16 @@ ANALYZE fpagg_tab_p3;
|
||||
SET enable_partitionwise_aggregate TO false;
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
Sort
|
||||
Sort Key: pagg_tab.a
|
||||
-> HashAggregate
|
||||
Group Key: pagg_tab.a
|
||||
Filter: (avg(pagg_tab.b) < '22'::numeric)
|
||||
-> Append
|
||||
-> Foreign Scan on fpagg_tab_p1 pagg_tab_1
|
||||
-> Foreign Scan on fpagg_tab_p2 pagg_tab_2
|
||||
-> Foreign Scan on fpagg_tab_p3 pagg_tab_3
|
||||
(9 rows)
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------
|
||||
GroupAggregate
|
||||
Group Key: pagg_tab.a
|
||||
Filter: (avg(pagg_tab.b) < '22'::numeric)
|
||||
-> Append
|
||||
-> Foreign Scan on fpagg_tab_p1 pagg_tab_1
|
||||
-> Foreign Scan on fpagg_tab_p2 pagg_tab_2
|
||||
-> Foreign Scan on fpagg_tab_p3 pagg_tab_3
|
||||
(7 rows)
|
||||
|
||||
-- Plan with partitionwise aggregates is enabled
|
||||
SET enable_partitionwise_aggregate TO true;
|
||||
@ -9823,34 +9819,32 @@ SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 O
|
||||
-- Should have all the columns in the target list for the given relation
|
||||
EXPLAIN (VERBOSE, COSTS OFF)
|
||||
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------------------
|
||||
Sort
|
||||
Output: t1.a, (count(((t1.*)::pagg_tab)))
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------------------------------------
|
||||
Merge Append
|
||||
Sort Key: t1.a
|
||||
-> Append
|
||||
-> HashAggregate
|
||||
Output: t1.a, count(((t1.*)::pagg_tab))
|
||||
Group Key: t1.a
|
||||
Filter: (avg(t1.b) < '22'::numeric)
|
||||
-> Foreign Scan on public.fpagg_tab_p1 t1
|
||||
Output: t1.a, t1.*, t1.b
|
||||
Remote SQL: SELECT a, b, c FROM public.pagg_tab_p1
|
||||
-> HashAggregate
|
||||
Output: t1_1.a, count(((t1_1.*)::pagg_tab))
|
||||
Group Key: t1_1.a
|
||||
Filter: (avg(t1_1.b) < '22'::numeric)
|
||||
-> Foreign Scan on public.fpagg_tab_p2 t1_1
|
||||
Output: t1_1.a, t1_1.*, t1_1.b
|
||||
Remote SQL: SELECT a, b, c FROM public.pagg_tab_p2
|
||||
-> HashAggregate
|
||||
Output: t1_2.a, count(((t1_2.*)::pagg_tab))
|
||||
Group Key: t1_2.a
|
||||
Filter: (avg(t1_2.b) < '22'::numeric)
|
||||
-> Foreign Scan on public.fpagg_tab_p3 t1_2
|
||||
Output: t1_2.a, t1_2.*, t1_2.b
|
||||
Remote SQL: SELECT a, b, c FROM public.pagg_tab_p3
|
||||
(25 rows)
|
||||
-> GroupAggregate
|
||||
Output: t1.a, count(((t1.*)::pagg_tab))
|
||||
Group Key: t1.a
|
||||
Filter: (avg(t1.b) < '22'::numeric)
|
||||
-> Foreign Scan on public.fpagg_tab_p1 t1
|
||||
Output: t1.a, t1.*, t1.b
|
||||
Remote SQL: SELECT a, b, c FROM public.pagg_tab_p1 ORDER BY a ASC NULLS LAST
|
||||
-> GroupAggregate
|
||||
Output: t1_1.a, count(((t1_1.*)::pagg_tab))
|
||||
Group Key: t1_1.a
|
||||
Filter: (avg(t1_1.b) < '22'::numeric)
|
||||
-> Foreign Scan on public.fpagg_tab_p2 t1_1
|
||||
Output: t1_1.a, t1_1.*, t1_1.b
|
||||
Remote SQL: SELECT a, b, c FROM public.pagg_tab_p2 ORDER BY a ASC NULLS LAST
|
||||
-> GroupAggregate
|
||||
Output: t1_2.a, count(((t1_2.*)::pagg_tab))
|
||||
Group Key: t1_2.a
|
||||
Filter: (avg(t1_2.b) < '22'::numeric)
|
||||
-> Foreign Scan on public.fpagg_tab_p3 t1_2
|
||||
Output: t1_2.a, t1_2.*, t1_2.b
|
||||
Remote SQL: SELECT a, b, c FROM public.pagg_tab_p3 ORDER BY a ASC NULLS LAST
|
||||
(23 rows)
|
||||
|
||||
SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
|
||||
a | count
|
||||
@ -9866,24 +9860,23 @@ SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1;
|
||||
-- When GROUP BY clause does not match with PARTITION KEY.
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------
|
||||
Sort
|
||||
Sort Key: pagg_tab.b
|
||||
-> Finalize HashAggregate
|
||||
Group Key: pagg_tab.b
|
||||
Filter: (sum(pagg_tab.a) < 700)
|
||||
-> Append
|
||||
-> Partial HashAggregate
|
||||
Group Key: pagg_tab.b
|
||||
-> Foreign Scan on fpagg_tab_p1 pagg_tab
|
||||
-> Partial HashAggregate
|
||||
Group Key: pagg_tab_1.b
|
||||
-> Foreign Scan on fpagg_tab_p2 pagg_tab_1
|
||||
-> Partial HashAggregate
|
||||
Group Key: pagg_tab_2.b
|
||||
-> Foreign Scan on fpagg_tab_p3 pagg_tab_2
|
||||
(15 rows)
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
Finalize GroupAggregate
|
||||
Group Key: pagg_tab.b
|
||||
Filter: (sum(pagg_tab.a) < 700)
|
||||
-> Merge Append
|
||||
Sort Key: pagg_tab.b
|
||||
-> Partial GroupAggregate
|
||||
Group Key: pagg_tab.b
|
||||
-> Foreign Scan on fpagg_tab_p1 pagg_tab
|
||||
-> Partial GroupAggregate
|
||||
Group Key: pagg_tab_1.b
|
||||
-> Foreign Scan on fpagg_tab_p2 pagg_tab_1
|
||||
-> Partial GroupAggregate
|
||||
Group Key: pagg_tab_2.b
|
||||
-> Foreign Scan on fpagg_tab_p3 pagg_tab_2
|
||||
(14 rows)
|
||||
|
||||
-- ===================================================================
|
||||
-- access rights and superuser
|
||||
|
@ -57,7 +57,7 @@ PG_MODULE_MAGIC;
|
||||
#define DEFAULT_FDW_STARTUP_COST 100.0
|
||||
|
||||
/* Default CPU cost to process 1 row (above and beyond cpu_tuple_cost). */
|
||||
#define DEFAULT_FDW_TUPLE_COST 0.01
|
||||
#define DEFAULT_FDW_TUPLE_COST 0.2
|
||||
|
||||
/* If no remote estimates, assume a sort costs 20% extra */
|
||||
#define DEFAULT_FDW_SORT_MULTIPLIER 1.2
|
||||
|
Loading…
Reference in New Issue
Block a user