From 461c64770e612661d974acc0fd39815108781580 Mon Sep 17 00:00:00 2001 From: Tatsuro Yamada Date: Thu, 5 Jun 2025 18:50:34 +0900 Subject: [PATCH] Add new GUC parameter: enable_groupagg Previously, there was no GUC parameter to control the use of GroupAggregate, so we couldn't influence the planner's choice in certain queries. This patch adds a new parameter, "enable_groupagg", which allows users to enable or disable GroupAggregate explicitly. By disabling GroupAggregate, the planner may choose HashAggregate instead, potentially resulting in a more efficient execution plan for some queries. --- doc/src/sgml/config.sgml | 14 ++++++++++++++ src/backend/optimizer/path/costsize.c | 3 +++ src/backend/utils/misc/guc_tables.c | 10 ++++++++++ src/backend/utils/misc/postgresql.conf.sample | 1 + src/include/optimizer/cost.h | 1 + src/test/regress/expected/sysviews.out | 3 ++- 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 021153b2a5f..edd0f3a13b8 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -5515,6 +5515,20 @@ ANY num_sync ( + enable_groupagg (boolean) + + enable_groupagg configuration parameter + + + + + Enables or disables the query planner's use of grouped + aggregation plan types. The default is on. + + + + enable_hashjoin (boolean) diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 3d44815ed5a..80c68008d85 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -150,6 +150,7 @@ bool enable_tidscan = true; bool enable_sort = true; bool enable_incremental_sort = true; bool enable_hashagg = true; +bool enable_groupagg = true; bool enable_nestloop = true; bool enable_material = true; bool enable_memoize = true; @@ -2737,6 +2738,8 @@ cost_agg(Path *path, PlannerInfo *root, /* Here we are able to deliver output on-the-fly */ startup_cost = input_startup_cost; total_cost = input_total_cost; + if (aggstrategy == AGG_SORTED && !enable_groupagg && enable_hashagg) + ++disabled_nodes; if (aggstrategy == AGG_MIXED && !enable_hashagg) ++disabled_nodes; /* calcs phrased this way to match HASHED case, see note above */ diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index f04bfedb2fd..a17b7fb1ba1 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -869,6 +869,16 @@ struct config_bool ConfigureNamesBool[] = true, NULL, NULL, NULL }, + { + {"enable_groupagg", PGC_USERSET, QUERY_TUNING_METHOD, + gettext_noop("Enables the planner's use of grouped aggregation plans."), + NULL, + GUC_EXPLAIN + }, + &enable_groupagg, + true, + NULL, NULL, NULL + }, { {"enable_material", PGC_USERSET, QUERY_TUNING_METHOD, gettext_noop("Enables the planner's use of materialization."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 341f88adc87..0514c327767 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -408,6 +408,7 @@ #enable_bitmapscan = on #enable_gathermerge = on #enable_hashagg = on +#enable_groupagg = on #enable_hashjoin = on #enable_incremental_sort = on #enable_indexscan = on diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h index d397fe27dc1..099d41fd7bd 100644 --- a/src/include/optimizer/cost.h +++ b/src/include/optimizer/cost.h @@ -57,6 +57,7 @@ extern PGDLLIMPORT bool enable_tidscan; extern PGDLLIMPORT bool enable_sort; extern PGDLLIMPORT bool enable_incremental_sort; extern PGDLLIMPORT bool enable_hashagg; +extern PGDLLIMPORT bool enable_groupagg; extern PGDLLIMPORT bool enable_nestloop; extern PGDLLIMPORT bool enable_material; extern PGDLLIMPORT bool enable_memoize; diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 83228cfca29..f10371d6e26 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -153,6 +153,7 @@ select name, setting from pg_settings where name like 'enable%'; enable_distinct_reordering | on enable_gathermerge | on enable_group_by_reordering | on + enable_groupagg | on enable_hashagg | on enable_hashjoin | on enable_incremental_sort | on @@ -172,7 +173,7 @@ select name, setting from pg_settings where name like 'enable%'; enable_seqscan | on enable_sort | on enable_tidscan | on -(24 rows) +(25 rows) -- There are always wait event descriptions for various types. InjectionPoint -- may be present or absent, depending on history since last postmaster start. -- 2.43.5