Re: Pushing down a subquery relation's ppi_clauses, and more ...
От | Andrei Lepikhov |
---|---|
Тема | Re: Pushing down a subquery relation's ppi_clauses, and more ... |
Дата | |
Msg-id | 6d607488-0442-452b-b536-7f16a172e05f@gmail.com обсуждение исходный текст |
Ответ на | Pushing down a subquery relation's ppi_clauses, and more ... (Richard Guo <guofenglinux@gmail.com>) |
Список | pgsql-hackers |
On 26/7/2025 05:09, Richard Guo wrote: > Here, I'd like to discuss whether it's worthwhile to also consider > pushing down a subquery relation's ppi_clauses if the subquery is > LATERAL. In my opinion, this direction makes sense. Moreover, I have seen sophisticated cases where SQL Server pushes parameterisation through GROUP BY down into a subquery, significantly speeding up execution. > First, it's important to note that pushing down ppi_clauses doesn't > always result in a better execution plan. While doing so can reduce > the amount of data processed in each aggregation invocation within the > subquery, it also means that the aggregation needs to be re-evaluated > for every outer tuple. If t1 is very small and t2 is large, pushing > down ppi_clauses can be a win. As t1 gets larger, this gets less > attractive, and eventually it will have a higher cost than the current > plan, where the aggregation is evaluated only once. Heh, let me propose a way to mitigate the issue I implemented in the Postgres fork. Instead of implementing numerous 'subplan flattening' transformations, I found that we can smooth the performance cliff by inserting a Memoise node at the top of the subplan. It reduces subplan evaluations in case we have duplicated parameter values. It is designed close to the subplan hashing feature, but, of course, logically distinct: it requires a top-down step after the bottom-up planning. It has some limitations, but if you have the resources to restructure the planning procedure slightly, it may be feasible in the Postgres core as well. > > Therefore, if we decide to pursue this approach, we would need to > generate two paths: one with the ppi_clauses pushed down, and one > without, and then compare their costs. A potential concern is that > this might require re-planning the subquery twice, which could > increase planning overhead. Here, we also designed an approach that may provide some insights for the further core development. Correlated subquery pull-up techniques always have bad corner cases (like you proposed). We added an extension list field to PlannerGlobal and PlannedStmt, enabling features to report the upper-level caller. The caller may build a series of plans with and without these contradictory features applied and compare the costs. I implemented the 'plan probing' technique in the GetCachedPlan, which is obviously has the most chances to be profitable because it is reused multiple times and has the infrastructure to track previous planning efforts. At the high architectural level, it seems close to the current plan cache auto mode logic: try options, compare costs, and remember decisions. I'm not sure it provides any answers - just existing techniques to ponder. -- regards, Andrei Lepikhov
В списке pgsql-hackers по дате отправления: