Re: Removing unneeded self joins
Andrei Lepikhov <lepihov@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
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. Maybe I lost the case you keep in mind? I would like to discover it. > > 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. -- regards, Andrei Lepikhov