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: Antonin Houska <ah@cybertec.at>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Andrew Gierth <andrew@tao11.riddles.org.uk>, pgsql-hackers@postgresql.org
Date: 2019-02-25T09:40:11Z
Lists: pgsql-hackers
(2019/02/23 0:21), Antonin Houska wrote:
> Etsuro Fujita<fujita.etsuro@lab.ntt.co.jp>  wrote:

>>> (2019/02/08 2:04), Antonin Houska wrote:
>>>> * regression tests: I think test(s) should be added for queries that have
>>>> ORDER BY clause but do not have GROUP BY (and also no LIMIT / OFFSET)
>>>> clause. I haven't noticed such tests.

>> I noticed that such queries would be processed by what we already have for
>> sort pushdown (ie, add_paths_with_pathkeys_for_rel()).  I might be missing
>> something, though.
>
> What about an ORDER BY expression that contains multiple Var nodes? For
> example
>
> SELECT * FROM foo ORDER BY x + y;
>
> I think the base relation should not be able to generate paths with the
> corresponding pathkeys, since its target should (besides PlaceHolderVars,
> which should not appear in the plan of this simple query at all) only emit
> individual Vars.

Actually, add_paths_with_pathkeys_for_rel() generates such pre-sorted 
paths for the base relation, as shown in the below example using HEAD 
without the patchset proposed in this thread:

postgres=# explain verbose select a+b from ft1 order by a+b;
                                 QUERY PLAN
--------------------------------------------------------------------------
  Foreign Scan on public.ft1  (cost=100.00..200.32 rows=2560 width=4)
    Output: (a + b)
    Remote SQL: SELECT a, b FROM public.t1 ORDER BY (a + b) ASC NULLS LAST
(3 rows)

I think it is OK for that function to generate such paths, as tlists for 
such paths would be adjusted in apply_scanjoin_target_to_paths(), by 
doing create_projection_path() to them.

Conversely, it appears that add_foreign_ordered_paths() added by the 
patchset would generate such pre-sorted paths *redundantly* when the 
input_rel is the final scan/join relation.  Will look into that.

Best regards,
Etsuro Fujita



Commits

  1. postgres_fdw: Perform the (FINAL, NULL) upperrel operations remotely.

  2. Refactor create_limit_path() to share cost adjustment code with FDWs.

  3. postgres_fdw: Modify regression tests for EPQ-related planning problems.

  4. postgres_fdw: Perform the (ORDERED, NULL) upperrel operations remotely.

  5. Save PathTargets for distinct/ordered relations in root->upper_targets[].

  6. Split create_foreignscan_path() into three functions.

  7. Fix test case for 'outer pathkeys do not match mergeclauses' fix.

  8. postgres_fdw: Avoid 'outer pathkeys do not match mergeclauses' error.