Re: Removing unneeded self joins
Alexander Korotkov <aekorotkov@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Remove GUC_NOT_IN_SAMPLE from enable_self_join_elimination
- 717d0e8dd945 18.0 landed
-
Put enable_self_join_elimination into postgresql.conf.sample
- c2d329260cd8 18.0 landed
-
Get rid of ojrelid local variable in remove_rel_from_query()
- e167191dc146 18.0 landed
-
Implement Self-Join Elimination
- fc069a3a6319 18.0 cited
-
Revert: Remove useless self-joins
- d1d286d83c0e 17.0 landed
-
Replace lateral references to removed rels in subqueries
- 466979ef031a 17.0 landed
-
Replace relids in lateral subquery parse tree during SJE
- 489072ab7a9e 17.0 landed
-
Forbid SJE with result relation
- 8c441c082797 17.0 landed
-
Fix misuse of RelOptInfo.unique_for_rels cache by SJE
- 30b4955a4668 17.0 landed
-
Replace the relid in some missing fields during SJE
- a7928a57b9f0 17.0 landed
-
Revert 56-bit relfilenode change and follow-up commits.
- a448e49bcbe4 16.0 cited
-
Stabilize timetz test across DST transitions.
- 4a071afbd056 14.0 cited
-
Speed up finding EquivalenceClasses for a given set of rels
- 3373c7155350 13.0 cited
-
Fix mark-and-restore-skipping test case to not be a self-join.
- 24d08f3c0a1f 12.0 landed
Attachments
- v2-0001-Disallow-removing-placeholders-during-Self-Join-E.patch (application/octet-stream) patch v2-0001
On Fri, Apr 4, 2025 at 11:35 AM Andrei Lepikhov <lepihov@gmail.com> wrote: > > On 4/4/25 04:53, Richard Guo wrote: > > On Fri, Apr 4, 2025 at 1:02 AM Alexander Korotkov <aekorotkov@gmail.com> wrote: > >> I've got an off-list bug report from Alexander Lakhin involving a > >> placeholder variable. Alena and Andrei proposed a fix. It is fairly > >> simple: we just shouldn't remove PHVs during self-join elimination, as > >> they might still be referenced from other parts of a query. The patch > >> is attached. I'm going to fix this if no objections. > > > > Hmm, I'm not sure about the fix. It seems to me that it simply > > prevents removing any PHVs in the self-join removal case. My concern > > is that this might result in PHVs that could actually be removed not > > being removed in many cases. > Let's play with use cases: > If a PHV is needed in the inner or outer only, it means we have a clause > in the baserestrictinfo that will be transferred to the keeping > relation, and we shouldn't remove the PHV. > Another case is when the PHV is needed in a join clause of the > self-join. I may imagine such a case: > > toKeep.x+toRemove.y=PHV > > This clause will be transformed to "toKeep.x+toKeep.y=PHV", pushed to > baserestrictinfo of keeping relation and should be saved. > I think it is possible to invent quite a narrow case of clause like the > following: > > PHV_evaluated_at_inner = PHV_evaluated_at_outer > > It needs to prove reproducibility. But even if it makes sense, it seems > to have no danger for further selectivity estimation compared to the > source clause and is a too-narrow case, isn't it? > In other cases, this PHV is needed something else, and we can't remove it. Should we add more regression tests covering these cases? > > > > Besides, there's the specific comment above this code explaining the > > logic behind the removal of PHVs. Shouldn't that comment be updated > > to reflect the changes? > It makes sense: for now, it seems that PHV removal should be used in the > case of an outer join removal. In the case of SJE, logically we make a > replacement, not a removal, and we should not reduce the number of > entities involved. I have added a brief comment about that. Check the attached patch. ------ Regards, Alexander Korotkov Supabase