From c0c82add7a9cf58584683abe5d498156424beebd Mon Sep 17 00:00:00 2001 From: James Coleman Date: Tue, 31 Mar 2020 20:32:08 -0400 Subject: [PATCH v49 4/7] ignore single key orderings --- src/backend/optimizer/path/allpaths.c | 7 +++++-- src/backend/optimizer/plan/planner.c | 14 +++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 93d967e812..b332e474b8 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -2842,7 +2842,10 @@ generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_r Path *subpath = (Path *) lfirst(lc2); GatherMergePath *path; - /* path has no ordering at all, can't use incremental sort */ + /* + * If the path has no ordering at all, then we can't use either + * incremental sort or rely on implict sorting with a gather merge. + */ if (subpath->pathkeys == NIL) continue; @@ -2907,7 +2910,7 @@ generate_useful_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_r * Consider incremental sort, but only when the subpath is already * partially sorted on a pathkey prefix. */ - if (enable_incrementalsort && presorted_keys > 0) + if (enable_incrementalsort && presorted_keys > 0 && list_length(useful_pathkeys) > 1) { Path *tmp; diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 73b7782dcb..6592d0446d 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -5010,7 +5010,7 @@ create_ordered_paths(PlannerInfo *root, continue; /* Likewise, if the path can't be used for incremental sort. */ - if (!presorted_keys) + if (!presorted_keys || list_length(root->sort_pathkeys) == 1) continue; /* Also consider incremental sort. */ @@ -5086,7 +5086,7 @@ create_ordered_paths(PlannerInfo *root, * XXX This is probably duplicate with the paths we already generate * in generate_useful_gather_paths in apply_scanjoin_target_to_paths. */ - if (enable_incrementalsort) + if (enable_incrementalsort && list_length(root->sort_pathkeys) > 1) { ListCell *lc; @@ -6561,7 +6561,7 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, * when the path is not already sorted and when incremental sort * is enabled. */ - if (is_sorted || !enable_incrementalsort) + if (is_sorted || !enable_incrementalsort || list_length(root->group_pathkeys) == 1) continue; /* Restore the input path (we might have added Sort on top). */ @@ -6688,7 +6688,7 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, * when the path is not already sorted and when incremental * sort is enabled. */ - if (is_sorted || !enable_incrementalsort) + if (is_sorted || !enable_incrementalsort || list_length(root->group_pathkeys) == 1) continue; /* Restore the input path (we might have added Sort on top). */ @@ -7005,7 +7005,7 @@ create_partial_grouping_paths(PlannerInfo *root, } /* Consider incremental sort on all partial paths, if enabled. */ - if (enable_incrementalsort) + if (enable_incrementalsort && list_length(root->group_pathkeys) > 1) { foreach(lc, input_rel->pathlist) { @@ -7106,7 +7106,7 @@ create_partial_grouping_paths(PlannerInfo *root, * when the path is not already sorted and when incremental sort * is enabled. */ - if (is_sorted || !enable_incrementalsort) + if (is_sorted || !enable_incrementalsort || list_length(root->group_pathkeys) == 1) continue; /* Restore the input path (we might have added Sort on top). */ @@ -7278,7 +7278,7 @@ gather_grouping_paths(PlannerInfo *root, RelOptInfo *rel) add_path(rel, path); } - if (!enable_incrementalsort) + if (!enable_incrementalsort || list_length(root->group_pathkeys) == 1) return; /* also consider incremental sort on partial paths, if enabled */ -- 2.17.1