diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 5c08442..aa38f56 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -2020,6 +2020,19 @@ SET ENABLE_SEQSCAN TO OFF; + + enable_material (boolean) + + enable_material configuration parameter + + + + Enables or disables the query planner's use of materialization. + The default is on. + + + + enable_mergejoin (boolean) diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 74ec77b..96d9293 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -114,6 +114,7 @@ bool enable_tidscan = true; bool enable_sort = true; bool enable_hashagg = true; bool enable_nestloop = true; +bool enable_material = true; bool enable_mergejoin = true; bool enable_hashjoin = true; @@ -1853,7 +1854,7 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo) cpu_operator_cost * inner_path_rows * rescanratio; /* Prefer materializing if it looks cheaper */ - if (mat_inner_cost < bare_inner_cost) + if (enable_material && mat_inner_cost < bare_inner_cost) path->materialize_inner = true; /* @@ -1879,7 +1880,7 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo) * We don't try to adjust the cost estimates for this consideration, * though. */ - else if (innersortkeys != NIL && + else if (enable_material && innersortkeys != NIL && relation_byte_size(inner_path_rows, inner_path->parent->width) > (work_mem * 1024L)) path->materialize_inner = true; diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index f7cd936..19465ad 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -440,7 +440,8 @@ match_unsorted_outer(PlannerInfo *root, * Consider materializing the cheapest inner path, unless it is one * that materializes its output anyway. */ - if (!ExecMaterializesOutput(inner_cheapest_total->pathtype)) + if (enable_material && + !ExecMaterializesOutput(inner_cheapest_total->pathtype)) matpath = (Path *) create_material_path(innerrel, inner_cheapest_total); diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 57af47a..de62c7e 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -580,7 +580,7 @@ build_subplan(PlannerInfo *root, Plan *plan, List *rtable, List *rowmarks, * correlated subplans, we add Material unless the subplan's top plan * node would materialize its output anyway. */ - else if (splan->parParam == NIL && + else if (splan->parParam == NIL && enable_material && !ExecMaterializesOutput(nodeTag(plan))) plan = materialize_finished_plan(plan); diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 1cf899e..c9d934f 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -644,6 +644,14 @@ static struct config_bool ConfigureNamesBool[] = true, NULL, NULL }, { + {"enable_material", PGC_USERSET, QUERY_TUNING_METHOD, + gettext_noop("Enables the planner's use of materialization."), + NULL + }, + &enable_material, + true, NULL, NULL + }, + { {"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD, gettext_noop("Enables the planner's use of nested-loop join plans."), NULL diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 48c09d1..c3f985a 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -206,6 +206,7 @@ #enable_hashagg = on #enable_hashjoin = on #enable_indexscan = on +#enable_material = on #enable_mergejoin = on #enable_nestloop = on #enable_seqscan = on diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h index a389229..376bb1b 100644 --- a/src/include/optimizer/cost.h +++ b/src/include/optimizer/cost.h @@ -57,6 +57,7 @@ extern bool enable_tidscan; extern bool enable_sort; extern bool enable_hashagg; extern bool enable_nestloop; +extern bool enable_material; extern bool enable_mergejoin; extern bool enable_hashjoin; extern int constraint_exclusion; diff --git a/src/test/regress/expected/rangefuncs.out b/src/test/regress/expected/rangefuncs.out index a32cbf5..66736a3 100644 --- a/src/test/regress/expected/rangefuncs.out +++ b/src/test/regress/expected/rangefuncs.out @@ -5,12 +5,13 @@ SELECT name, setting FROM pg_settings WHERE name LIKE 'enable%'; enable_hashagg | on enable_hashjoin | on enable_indexscan | on + enable_material | on enable_mergejoin | on enable_nestloop | on enable_seqscan | on enable_sort | on enable_tidscan | on -(9 rows) +(10 rows) CREATE TABLE foo2(fooid int, f2 int); INSERT INTO foo2 VALUES(1, 11);