1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

Allow incremental sorts for windowing functions

This expands on the work done in d2d8a229b and allows incremental sort
to be considered during create_window_paths().

Author: David Rowley
Reviewed-by: Daniel Gustafsson, Tomas Vondra
Discussion: https://postgr.es/m/CAApHDvoOHobiA2x13NtWnWLcTXYj9ddpCkv9PnAJQBMegYf_xw%40mail.gmail.com
This commit is contained in:
David Rowley
2020-09-15 23:44:45 +12:00
parent fe4f36bcde
commit 62e221e1c0
3 changed files with 100 additions and 7 deletions

View File

@ -4582,14 +4582,17 @@ create_window_paths(PlannerInfo *root,
/*
* Consider computing window functions starting from the existing
* cheapest-total path (which will likely require a sort) as well as any
* existing paths that satisfy root->window_pathkeys (which won't).
* existing paths that satisfy or partially satisfy root->window_pathkeys.
*/
foreach(lc, input_rel->pathlist)
{
Path *path = (Path *) lfirst(lc);
int presorted_keys;
if (path == input_rel->cheapest_total_path ||
pathkeys_contained_in(root->window_pathkeys, path->pathkeys))
pathkeys_count_contained_in(root->window_pathkeys, path->pathkeys,
&presorted_keys) ||
presorted_keys > 0)
create_one_window_path(root,
window_rel,
path,
@ -4664,18 +4667,42 @@ create_one_window_path(PlannerInfo *root,
{
WindowClause *wc = lfirst_node(WindowClause, l);
List *window_pathkeys;
int presorted_keys;
bool is_sorted;
window_pathkeys = make_pathkeys_for_window(root,
wc,
root->processed_tlist);
is_sorted = pathkeys_count_contained_in(window_pathkeys,
path->pathkeys,
&presorted_keys);
/* Sort if necessary */
if (!pathkeys_contained_in(window_pathkeys, path->pathkeys))
if (!is_sorted)
{
path = (Path *) create_sort_path(root, window_rel,
path,
window_pathkeys,
-1.0);
/*
* No presorted keys or incremental sort disabled, just perform a
* complete sort.
*/
if (presorted_keys == 0 || !enable_incremental_sort)
path = (Path *) create_sort_path(root, window_rel,
path,
window_pathkeys,
-1.0);
else
{
/*
* Since we have presorted keys and incremental sort is
* enabled, just use incremental sort.
*/
path = (Path *) create_incremental_sort_path(root,
window_rel,
path,
window_pathkeys,
presorted_keys,
-1.0);
}
}
if (lnext(activeWindows, l))