Skip to content

Commit f57c631

Browse files
committed
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
1 parent 4d616b1 commit f57c631

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

src/backend/optimizer/plan/createplan.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2398,10 +2398,13 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path)
23982398
ListCell *lc;
23992399

24002400
/*
2401-
* WindowAgg can project, so no need to be terribly picky about child
2402-
* tlist, but we do need grouping columns to be available
2401+
* Choice of tlist here is motivated by the fact that WindowAgg will be
2402+
* storing the input rows of window frames in a tuplestore; it therefore
2403+
* behooves us to request a small tlist to avoid wasting space. We do of
2404+
* course need grouping columns to be available.
24032405
*/
2404-
subplan = create_plan_recurse(root, best_path->subpath, CP_LABEL_TLIST);
2406+
subplan = create_plan_recurse(root, best_path->subpath,
2407+
CP_LABEL_TLIST | CP_SMALL_TLIST);
24052408

24062409
tlist = build_path_tlist(root, &best_path->path);
24072410

0 commit comments

Comments
 (0)