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:
@ -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))
|
||||
|
Reference in New Issue
Block a user