Re: Significant Execution Time Difference Between PG13.14 and PG16.4 for Query on information_schema Tables.
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: David Rowley <dgrowleyml@gmail.com>
Cc: nikhil raj <nikhilraj474@gmail.com>, pgsql-hackers@lists.postgresql.org
Date: 2024-08-27T21:52:12Z
Lists: pgsql-hackers, pgsql-general
Attachments
- avoid-unnecessary-PHV-during-pullup-wip.patch (text/x-diff) patch
I wrote: > We didn't see this particular behavior before 2489d76c49 because > pullup_replace_vars avoided inserting a PHV: > * If it contains a Var of the subquery being pulled up, and > * does not contain any non-strict constructs, then it's > * certainly nullable so we don't need to insert a > * PlaceHolderVar. > I dropped that case in 2489d76c49 because now we need to attach > nullingrels to the expression. You could imagine attaching the > nullingrels to the contained Var(s) instead of putting a PHV on top, > but that seems like a mess and I'm not quite sure it's semantically > the same. In any case it wouldn't fix adjacent cases where there is > a non-strict construct in the subquery output expression. I realized that actually we do have the mechanism for making that work: we could apply add_nulling_relids to the expression, if it meets those same conditions. This is a kluge really, but it would restore the status quo ante in a fairly localized fashion that seems like it might be safe enough to back-patch into v16. Here's a WIP patch that does it like that. One problem with it is that it requires rcon->relids to be calculated in cases where we didn't need that before, which is probably not *that* expensive but it's annoying. If we go forward with this, I'm thinking about changing add_nulling_relids' API contract to say "if target_relid is NULL then all level-zero Vars/PHVs are modified", so that we don't need that relid set in non-LATERAL cases. The other problem with this is that it breaks one test case in memoize.sql: a query that formerly generated a memoize plan now does not use memoize. I am not sure why not --- does that mean anything to you? regards, tom lane
Commits
-
Avoid inserting PlaceHolderVars in cases where pre-v16 PG did not.
- b43110869fd8 17.0 landed
- 80d9c07a4a8c 16.5 landed
- cb8e50a4a09f 18.0 landed
-
Remove one memoize test case added by commit 069d0ff02.
- 3409b4db631f 18.0 landed