postgrespro.git / summary / log / commit / refs

commit    a9056cc637f2d183eefa165ebbd0308d9a89abb9
Author:   Andrew Gierth <rhodiumtoad@postgresql.org>
Date:     Wed Nov 06 04:13:30 2019 +0000

    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


src/backend/optimizer/plan/createplan.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 0c036209f0..aee81bd755 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -2397,10 +2397,13 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path) ListCell *lc; /* - * WindowAgg can project, so no need to be terribly picky about child - * tlist, but we do need grouping columns to be available + * Choice of tlist here is motivated by the fact that WindowAgg will be + * 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); [parent: 979766c0afce]