Re: [HACKERS] postgres_fdw bug in 9.6 - Mailing list pgsql-hackers
From | Ashutosh Bapat |
---|---|
Subject | Re: [HACKERS] postgres_fdw bug in 9.6 |
Date | |
Msg-id | CAFjFpRfSbaaWyJxaGs5Au1gy3puQ13mTGTGF7Az2FAhi+1QQEQ@mail.gmail.com Whole thread Raw |
In response to | Re: [HACKERS] postgres_fdw bug in 9.6 (Robert Haas <robertmhaas@gmail.com>) |
Responses |
Re: [HACKERS] postgres_fdw bug in 9.6
|
List | pgsql-hackers |
On Thu, Jan 19, 2017 at 10:38 PM, Robert Haas <robertmhaas@gmail.com> wrote: > On Wed, Jan 18, 2017 at 10:26 PM, Ashutosh Bapat > <ashutosh.bapat@enterprisedb.com> wrote: >>> Yes, I think that's broadly the approach Tom was recommending. >> >> I don't have problem with that approach, but the latest patch has >> following problems. >> 1. We are copying chunks of path creation logic, instead of reusing >> corresponding functions. > > Exactly which functions do you think we ought to be reusing that the > patch currently doesn't reuse? > >> 2. There are many cases where the new function would return no local >> path and hence postgres_fdw doesn't push down the join [1]. This will >> be performance regression compared to 9.6. > > Some, or many? How many? Which ones? At least some of the problems > you were complaining about look like basic validity checks that were > copied from joinpath.c, so they're probably necessary for correctness. > It's worth remembering that we're trying to fix a bug here; if that > makes some cases perform less well, that's sad, but not as sad as > throwing a bogus error, which is what's happening right now. AFAIU, the problem esp. with parameterized paths is this: If rel1 is required to be parameterized by rel2 (because of lateral references?), a nested loop join with rel2 as outer relation and rel1 as inner relation is possible. postgres_fdw and hence this function, however doesn't consider all the possible join combinations and thus when this function is presented with rel1 as outer and rel2 as inner would refuse to create a path. More generally, while creating local paths, we try many combinations of participating relations, some of which do not produce local paths and some of them do (AFAIK, it happens in case of lateral references, but there might be other cases). postgres_fdw, however considers only a single combination, which may or may not have produced local path. In such a case, postgres_fdw would create a foreign join path but won't get a local path and thus bail out. Obviously, we don't want CreateLocalJoinPath() to try out all the combinations. That is the simplicity of copying an existing path; all combinations have been tried already. If we really want a nested loop join, we may try pulling inner and outer paths from an existing path and build a nested loop join (that's just a suggestion). Take example of /* * If the cheapest-total outer path is parameterized by the * inner rel, we can't generate a nestloop path. (There's no * use looking for alternative outer paths, sinceit should * already be the least-parameterized available path.) */ if (PATH_PARAM_BY_REL(outer_path,innerrel)) return NULL; We may be able to create a nest loop path if we switch inner and outer relations. I have provided a patch in [1] to fix the bogus error. But if we want to replace one approach (when there's a way to fix bug in that approach) with another (to fix that bug and improve), the other approach should be equally efficient. > > I'm a bit sketchy about this kind of thing, though: > > ! if (required_outer) > { > ! bms_free(required_outer); > ! return NULL; > } > > I don't understand what would stop that from making this fail to > generate parameterized paths in some cases in which it would be legal > to do so, and the comment is very brief. I am not so much worried about this though :). GetExistingLocalJoinPath() also does not handle that case. The new function is not making it worse in this case. 731 /* Skip parameterised paths. */ 732 if (path->param_info != NULL) 733 continue; [1] https://www.postgresql.org/message-id/CAFjFpRd9oZEkur9aOrMh2Toxq4NYuUSw2kB9S%2BO%3DuvZ4xcR%3DSw@mail.gmail.com -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company
pgsql-hackers by date: