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
- v13-0001-Implement-Self-Join-Elimination.patch (application/octet-stream) patch v13-0001
Hi! On Tue, Feb 11, 2025 at 5:31 PM Alena Rybakina <a.rybakina@postgrespro.ru> wrote: > Hi! Thank you for the work with this subject, I think it is really > important. > > On 10.02.2025 22:58, Alexander Korotkov wrote: > > Hi! > > > > On Mon, Feb 10, 2025 at 7:19 AM Andrei Lepikhov <lepihov@gmail.com> wrote: > >> On 9/2/2025 18:41, Alexander Korotkov wrote: > >>> Regarding adjust_relid_set() and replace_relid(). I think they are > >>> now strictly equivalent, except for the case then old relid is given > >>> and not found. In this case adjust_relid_set() returns the original > >>> relids while replace_relid() returns a copy. The behavior of > >>> adjust_relid_set() appears more desirable as we don't need extra > >>> copying when no modification is done. So, I've replaced all > >>> replace_relid() with adjust_relid_set(). > >> Ok, I glanced into it, and it makes sense to merge these routines. > >> I think the comment to adjust_relid_set() should be arranged, too. See > >> the attachment for a short variant of such modification. > >>> Also, I did some grammar correction to your new comment in tests. > >> Thanks! > > I've further revised adjust_relid_set() header comment. > > > > Looking back to the work done since previous attempt to commit this to > > pg17, I can highlight following. > > 1) We're now using more of existing infrastructure including > > adjust_relid_set() and ChangeVarNodes(). The most of complexity is > > still there though. > > 2) We've checked few ways to further simplify this patch. But yet the > > current way still feels to be best possible. > > 3) For sure, several bugs were fixed. > > > > I think we could give it another chance for pg18 after some further > > polishing (at least commit message still needs to be revised). Any > > thoughts on this? Tom? > > > I didn't find any mistakes, I just have a refactoring remark. I think > the part where we add non-redundant expressions with the > binfo_candidates, jinfo_candidates > check can be moved to a separate function, otherwise the code is very > repetitive in this place. I did it and attached diff file Thank you. I've integrated that into a patch. However, I've to change keep_rinfo_list to be passed by pointer to add_non_redundant_clauses(), because it might be changed in distribute_restrictinfo_to_rels(). Without that there is a case of duplicated clause in regression tests. I've changed 'inner' and 'outer' vise versa in remove_self_joins_one_group() for better readability (I believe that was discussed upthread but lost). Also, I did a round of improvement for comments and commit message. ------ Regards, Alexander Korotkov Supabase