Re: Early WIP/PoC for inlining CTEs
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andreas Karlsson <andreas@proxel.se>
Cc: Andrew Gierth <andrew@tao11.riddles.org.uk>,
David Fetter <david@fetter.org>,
Thomas Munro <thomas.munro@enterprisedb.com>,
Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2019-01-25T22:22:36Z
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 →
-
Prevent inlining of multiply-referenced CTEs with outer recursive refs.
- 9476131278c7 12.0 landed
-
Allow user control of CTE materialization, and change the default behavior.
- 608b167f9f9c 12.0 landed
-
Split QTW_EXAMINE_RTES flag into QTW_EXAMINE_RTES_BEFORE/_AFTER.
- 18c0da88a5d9 12.0 landed
-
document when PREPARE uses generic plans
- fab9d1da4a21 9.6.0 cited
Attachments
- inlining-ctes-v9.patch (text/x-diff) patch v9
Andreas Karlsson <andreas@proxel.se> writes: > [ inlining-ctes-v8.patch ] I went ahead and pushed the stuff about QTW_EXAMINE_RTES_BEFORE/_AFTER, because that seems like an independent change with other possible uses. Attached is an updated version of the rest of the patch, with mostly cosmetic changes. I've not touched the documentation, but I think this is otherwise committable if we are satisfied with the semantics. However ... after thinking about it more, I'm not really satisfied with that. In particular I don't like the fact that by default this will inline regardless of the number of references to the CTE. I doubt that inlining when there are multiple references is so likely to be a win as to justify it being the default, especially given that it flies in the face of what our documentation has said for as long as we've had CTEs. Therefore, I'm reversing my previous opinion that we should not have an explicit NOT MATERIALIZED option. I think we should add that, and the behavior ought to be: * No option given: inline if there's exactly one reference. * With MATERIALIZED: never inline. * With NOT MATERIALIZED: inline regardless of the number of references. (Obviously, we should not inline if there's RECURSIVE or the CTE potentially has side-effects, regardless of the user option; I don't think those cases are up for debate.) I haven't done anything about that here, but the changes would be pretty minor. regards, tom lane