RE: CTE Inline On TPC-DS Query 95 - Mailing list pgsql-performance

From
Subject RE: CTE Inline On TPC-DS Query 95
Date
Msg-id 004c01db5853$44124720$cc36d560$@msym.fr
Whole thread Raw
In response to Re: CTE Inline On TPC-DS Query 95  (David Rowley <dgrowleyml@gmail.com>)
Responses Re: CTE Inline On TPC-DS Query 95
List pgsql-performance
Hi,

The choice between inlining and materializing is not a question of syntax. It matters if the parent query references
theCTE expression more than once but this is not a decisive factor... 

Sometimes one is better and sometimes the other is best.
In Oracle, the choice is done by COST. This should be the same for PostgreSQL. In essence, it is the same thing for
views:inlining or materializing... 

Michel SALAIS


-----Message d'origine-----
De : David Rowley <dgrowleyml@gmail.com>
Envoyé : mardi 26 novembre 2024 05:03
À : Ba Jinsheng <bajinsheng@u.nus.edu>
Cc : Andrei Lepikhov <lepihov@gmail.com>; pgsql-performance@lists.postgresql.org
Objet : Re: CTE Inline On TPC-DS Query 95

On Tue, 26 Nov 2024 at 10:03, Ba Jinsheng <bajinsheng@u.nus.edu> wrote:
> If we specify ``NOT MATERIALIZED`` for the query, the execution time is reduced from 1min to 1s due to the usage of
inlineCTE. It seems expected as described in the PostgreSQL documentation. However, from the code:
https://github.com/postgres/postgres/blob/REL_17_STABLE/src/backend/optimizer/plan/subselect.c#L939,I understand that
thisquery does not contain volatile functions and includes simple predicates. I am wondering whether we can relax this
conditionchecking, to enable inline CTE for such queries? Because it seems the performance benefit is huge on a
standardbenchmark. 

The relevant part of the documentation [1] seems to be "By default, this happens if the parent query references the
WITHquery just once, but not if it references the WITH query more than once." 

If you're proposing that we change the heuristics for when to inline CTEs, then I suggest you go and check the archives
forwhy we made this decision. You'll need to prove to us why your newly proposed heuristic is better than what we have.
That'sgoing to take more than one example query to show that your heuristics are better. 

However, just to save you from wasting any time, I highly doubt an adjustment to the CTE inlining heuristics alone is
enough. Just imagine the CTE evaluation performed a Seq Scan on a 1 billion row table and found 1 matching row. Let's
assumethe remaining part of the query is very cheap. It's obviously going to be better to materialise the CTE so that
weperform the Seq Scan once rather than twice (or however many times the CTE is referenced). Adjusting the heuristics
hereis just going to make some queries faster at the expense of making other queries slower. That's never going to pass
communitystandards. 

If you truly wanted to improve things here, the heuristics would need to be swapped out with a cost-based decision. I
cantell you now, that doing that is a very difficult task as it basically requires performing the join search and quite
alarge portion of planning once for each combination of CTE inlined vs not-inlined. If you had a query with a dozen or
soCTEs, that's going to be a very costly thing to plan. 

David

[1] https://www.postgresql.org/docs/current/queries-with.html





pgsql-performance by date:

Previous
From: David Mullineux
Date:
Subject: Re: huge shared_blocks_hit one select but manually run very fast
Next
From: David Rowley
Date:
Subject: Re: CTE Inline On TPC-DS Query 95