Re: Removing unneeded self joins

Andrei Lepikhov <lepihov@gmail.com>

From: Andrei Lepikhov <lepihov@gmail.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: Alexander Korotkov <aekorotkov@gmail.com>, Alena Rybakina <a.rybakina@postgrespro.ru>, Richard Guo <guofenglinux@gmail.com>, Ranier Vilela <ranier.vf@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, Tom Lane <tgl@sss.pgh.pa.us>, Robert Haas <robertmhaas@gmail.com>, Alexander Lakhin <exclusion@gmail.com>, "Gregory Stark (as CFM)" <stark.cfm@gmail.com>, Michał Kłeczek <michal@kleczek.org>, Dean Rasheed <dean.a.rasheed@gmail.com>
Date: 2025-06-27T06:46:29Z
Lists: pgsql-hackers

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Remove GUC_NOT_IN_SAMPLE from enable_self_join_elimination

  2. Put enable_self_join_elimination into postgresql.conf.sample

  3. Get rid of ojrelid local variable in remove_rel_from_query()

  4. Implement Self-Join Elimination

  5. Revert: Remove useless self-joins

  6. Replace lateral references to removed rels in subqueries

  7. Replace relids in lateral subquery parse tree during SJE

  8. Forbid SJE with result relation

  9. Fix misuse of RelOptInfo.unique_for_rels cache by SJE

  10. Replace the relid in some missing fields during SJE

  11. Revert 56-bit relfilenode change and follow-up commits.

  12. Stabilize timetz test across DST transitions.

  13. Speed up finding EquivalenceClasses for a given set of rels

  14. Fix mark-and-restore-skipping test case to not be a self-join.

On 27/6/2025 02:26, Michael Paquier wrote:
> The point regarding the search join hook may stand, though.  Perhaps
> somebody should check if we're still OK with this change in the
> context of the self-join work.  I tend to think that we are and I
> agree that removing the joins when calling the hook can show benefits,
> but it may be surprising and users tend to be very noisy with plan
> stability, particularly if some of the FROM aliases get silenced by
> the backend without the module knowing about that.  At least there is
> the trick with SET enable_self_join_elimination available as a last
> resort method.
Parse tree transformation (pull-ups, flattenings) adds joins, constant 
clause evaluation or partition pruning may smash whole subtrees - the 
optimisation process is quite unstable from the query structure's point 
of view.
If I understand correctly, pg_hint_plan needs to differentiate 'never 
existed' relations and removed ones. In that sense, up to v.15, Postgres 
saved RelOptInfo after removing the join (see e9a20e4).

-- 
regards, Andrei Lepikhov