Re: Problems with plan estimates in postgres_fdw
Etsuro Fujita <fujita.etsuro@lab.ntt.co.jp>
From: Etsuro Fujita <fujita.etsuro@lab.ntt.co.jp>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Andrew Gierth <andrew@tao11.riddles.org.uk>, pgsql-hackers@postgresql.org
Date: 2018-12-17T13:09:34Z
Lists: pgsql-hackers
Attachments
(2018/10/09 14:48), Etsuro Fujita wrote: > (2018/10/05 19:15), Etsuro Fujita wrote: >> (2018/08/02 23:41), Tom Lane wrote: >>> Andrew Gierth<andrew@tao11.riddles.org.uk> writes: >>>> [ postgres_fdw is not smart about exploiting fast-start plans ] >>> >>> Yeah, that's basically not accounted for at all in the current design. >>> >>>> One possibility: would it be worth adding an option to EXPLAIN that >>>> makes it assume cursor_tuple_fraction? >>> >>> [ handwaving ahead ] >>> >>> I wonder whether it could be done without destroying postgres_fdw's >>> support for old servers, by instead including a LIMIT in the query sent >>> for explaining. The trick would be to know what value to put as the >>> limit, though. It'd be easy to do if we were willing to explain the >>> query >>> twice (the second time with a limit chosen as a fraction of the rowcount >>> seen the first time), but man that's an expensive solution. >>> >>> Another component of any real fix here would be to issue "SET >>> cursor_tuple_fraction" before opening the execution cursor, so as to >>> ensure that we actually get an appropriate plan on the remote side. >>> >>> If we could tell whether there's going to be any use in fast-start >>> plans, >>> it might make sense to build two scan paths for a foreign table, one >>> based >>> on a full-table scan and one based on EXPLAIN ... LIMIT 1. This still >>> means two explain requests, which is why I'm not thrilled about doing it >>> unless there's a high probability of the extra explain being useful. >> >> Agreed, but ISTM that to address the original issue, it would be enough >> to jsut add LIMIT (or ORDER BY LIMIT) pushdown to postgres_fdw based on >> the upper-planner-pathification work. > > Will work on it unless somebody else wants to. Here is a set of WIP patches for pushing down ORDER BY LIMIT to the remote: * 0001-postgres-fdw-upperrel-ordered-WIP.patch: This patch performs the UPPERREL_ORDERED step remotely. * 0002-postgres-fdw-upperrel-final-WIP.patch: This patch performs the UPPERREL_FINAL step remotely. Currently, this only supports for SELECT commands, and pushes down LIMIT/OFFSET to the remote if possible. This also removes LockRows if there is a FOR UPDATE/SHARE clause, which would be safe because postgres_fdw performs early locking. I'd like to leave INSERT, UPDATE and DELETE cases for future work. It is my long-term todo to rewrite PlanDirectModify using the upper-planner-pathification work. :) For some regression test cases with ORDER BY and/or LIMIT, I noticed that these patches still cannot push down those clause to the remote. I guess it would be needed to tweak the cost/size estimation added by these patches, but I didn't look at that in detail yet. Maybe I'm missing something, though. Comments welcome! Best regards, Etsuro Fujita
Commits
-
postgres_fdw: Perform the (FINAL, NULL) upperrel operations remotely.
- d50d172e517c 12.0 landed
-
Refactor create_limit_path() to share cost adjustment code with FDWs.
- aef65db6769e 12.0 landed
-
postgres_fdw: Modify regression tests for EPQ-related planning problems.
- 0269edefacb7 12.0 landed
-
postgres_fdw: Perform the (ORDERED, NULL) upperrel operations remotely.
- ffab494a4d46 12.0 landed
-
Save PathTargets for distinct/ordered relations in root->upper_targets[].
- 3fdc374b5d24 12.0 landed
-
Split create_foreignscan_path() into three functions.
- 34ea1ab7fd30 12.0 cited
-
Fix test case for 'outer pathkeys do not match mergeclauses' fix.
- 99f6a17dd62a 11.0 cited
-
postgres_fdw: Avoid 'outer pathkeys do not match mergeclauses' error.
- 4bbf6edfbd5d 11.0 cited