Commit a9056cc6 authored by Andrew Gierth's avatar Andrew Gierth

Request small targetlist for input to WindowAgg.

WindowAgg will potentially store large numbers of input rows into
tuplestores to allow access to other rows in the frame. If the input
is coming via an explicit Sort node, then unneeded columns will
already have been discarded (since Sort requests a small tlist); but
there are idioms like COUNT(*) OVER () that result in the input not
being sorted at all, and cases where the input is being sorted by some
means other than a Sort; if we don't request a small tlist, then
WindowAgg's storage requirement is inflated by the unneeded columns.

Backpatch back to 9.6, where the current tlist handling was added.
(Prior to that, WindowAgg would always use a small tlist.)

Discussion: https://postgr.es/m/87a7ator8n.fsf@news-spur.riddles.org.uk
parent 979766c0
...@@ -2397,10 +2397,13 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path) ...@@ -2397,10 +2397,13 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path)
ListCell *lc; ListCell *lc;
/* /*
* WindowAgg can project, so no need to be terribly picky about child * Choice of tlist here is motivated by the fact that WindowAgg will be
* tlist, but we do need grouping columns to be available * storing the input rows of window frames in a tuplestore; it therefore
* behooves us to request a small tlist to avoid wasting space. We do of
* course need grouping columns to be available.
*/ */
subplan = create_plan_recurse(root, best_path->subpath, CP_LABEL_TLIST); subplan = create_plan_recurse(root, best_path->subpath,
CP_LABEL_TLIST | CP_SMALL_TLIST);
tlist = build_path_tlist(root, &best_path->path); tlist = build_path_tlist(root, &best_path->path);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment