From e5dc0ccd72cd4dce25de22982a1d950ae73f1f6a Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Fri, 3 Apr 2020 18:43:50 +0200 Subject: [PATCH 3/5] rework add_partial_path_precheck - check costs first --- src/backend/optimizer/util/pathnode.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 7211fc35fd..4e798b801a 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -880,18 +880,25 @@ add_partial_path_precheck(RelOptInfo *parent_rel, Cost startup_cost, { Path *old_path = (Path *) lfirst(p1); PathKeysComparison keyscmp; + bool compared = false; - keyscmp = compare_pathkeys(pathkeys, old_path->pathkeys); - if (keyscmp != PATHKEYS_DIFFERENT) + if ((startup_cost > old_path->startup_cost * STD_FUZZ_FACTOR) && + (total_cost > old_path->total_cost * STD_FUZZ_FACTOR)) { - if ((startup_cost > old_path->startup_cost * STD_FUZZ_FACTOR) && - (total_cost > old_path->total_cost * STD_FUZZ_FACTOR) && - (keyscmp != PATHKEYS_BETTER1)) + keyscmp = compare_pathkeys(pathkeys, old_path->pathkeys); + compared = true; + + if (keyscmp != PATHKEYS_BETTER1) return false; + } + + if ((old_path->startup_cost > startup_cost * STD_FUZZ_FACTOR) && + (old_path->total_cost > total_cost * STD_FUZZ_FACTOR)) + { + if (!compared) + keyscmp = compare_pathkeys(pathkeys, old_path->pathkeys); - if ((old_path->startup_cost > startup_cost * STD_FUZZ_FACTOR) && - (old_path->total_cost > total_cost * STD_FUZZ_FACTOR) && - (keyscmp != PATHKEYS_BETTER2)) + if (keyscmp != PATHKEYS_BETTER2) return true; } } -- 2.21.1