On Tue, 5 Apr 2022 at 19:38, Andy Fan <[email protected]> wrote:
> 1. We can do more on PASSTHROUGH, we just bypass the window function
> currently, but IIUC we can ignore all of the following tuples in current
> partition
> once we go into this mode. patch 0001 shows what I mean.
Yeah, there is more performance to be had than even what you've done
there. There's no reason really for spool_tuples() to do
tuplestore_puttupleslot() when we're not in run mode.
The attached should give slightly more performance. I'm unsure if
there's more that can be done for window aggregates, i.e.
eval_windowaggregates()
I'll consider the idea about doing all the filtering in
nodeWindowAgg.c. For now I made find_window_run_conditions() keep the
qual so that it's still filtered in the subquery level when there is a
PARTITION BY clause. Probably the best way would be to make
nodeWindowAgg.c just loop with a for(;;) loop. I'll need to give it
more thought. I'll do that in the morning.
David
diff --git a/src/backend/executor/nodeWindowAgg.c
b/src/backend/executor/nodeWindowAgg.c
index 869dcd74df..19fe720d9c 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1248,6 +1248,9 @@ spool_tuples(WindowAggState *winstate, int64 pos)
if (winstate->partition_spooled)
return; /* whole partition done
already */
+ if (winstate->status == WINDOWAGG_PASSTHROUGH)
+ pos = -1;
+
/*
* If the tuplestore has spilled to disk, alternate reading and writing
* becomes quite expensive due to frequent buffer flushes. It's cheaper
@@ -1256,7 +1259,7 @@ spool_tuples(WindowAggState *winstate, int64 pos)
* XXX this is a horrid kluge --- it'd be better to fix the performance
* problem inside tuplestore. FIXME
*/
- if (!tuplestore_in_memory(winstate->buffer))
+ else if (!tuplestore_in_memory(winstate->buffer))
pos = -1;
outerPlan = outerPlanState(winstate);
@@ -1295,9 +1298,12 @@ spool_tuples(WindowAggState *winstate, int64 pos)
}
}
- /* Still in partition, so save it into the tuplestore */
- tuplestore_puttupleslot(winstate->buffer, outerslot);
- winstate->spooled_rows++;
+ if (winstate->status == WINDOWAGG_RUN)
+ {
+ /* Still in partition, so save it into the tuplestore */
+ tuplestore_puttupleslot(winstate->buffer, outerslot);
+ winstate->spooled_rows++;
+ }
}
MemoryContextSwitchTo(oldcontext);