diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 459368e..d1d6f45 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -120,6 +120,7 @@ bool enable_bitmapscan = true; bool enable_tidscan = true; bool enable_sort = true; bool enable_hashagg = true; +bool enable_paramnestloop = true; bool enable_nestloop = true; bool enable_material = true; bool enable_mergejoin = true; @@ -1934,9 +1935,16 @@ final_cost_nestloop(PlannerInfo *root, NestPath *path, * would amount to optimizing for the case where the join method is * disabled, which doesn't seem like the way to bet. */ - if (!enable_nestloop) - startup_cost += disable_cost; - + if (path->innerjoinpath->param_info) + { + if (!enable_paramnestloop) + startup_cost += disable_cost; + } + else + { + if (!enable_nestloop) + startup_cost += disable_cost; + } /* cost of inner-relation source data (we already dealt with outer rel) */ if (path->jointype == JOIN_SEMI || path->jointype == JOIN_ANTI) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 38ba82f..22e51e4 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -837,8 +837,17 @@ static struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { + {"enable_paramnestloop", PGC_USERSET, QUERY_TUNING_METHOD, + gettext_noop("Enables the planner's use of parameterized nested-loop join plans."), + NULL + }, + &enable_paramnestloop, + true, + NULL, NULL, NULL + }, + { {"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD, - gettext_noop("Enables the planner's use of nested-loop join plans."), + gettext_noop("Enables the planner's use of non-parameterized nested-loop join plans."), NULL }, &enable_nestloop, diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h index 9999ca3..f89d817 100644 --- a/src/include/optimizer/cost.h +++ b/src/include/optimizer/cost.h @@ -62,6 +62,7 @@ extern bool enable_bitmapscan; extern bool enable_tidscan; extern bool enable_sort; extern bool enable_hashagg; +extern bool enable_paramnestloop; extern bool enable_nestloop; extern bool enable_material; extern bool enable_mergejoin;