]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Remove hashagg_avoid_disk_plan GUC.
authorPeter Geoghegan <pg@bowt.ie>
Tue, 28 Jul 2020 00:53:19 +0000 (17:53 -0700)
committerPeter Geoghegan <pg@bowt.ie>
Tue, 28 Jul 2020 00:53:19 +0000 (17:53 -0700)
Note: This GUC was originally named enable_hashagg_disk when it appeared
in commit 1f39bce0, which added disk-based hash aggregation.  It was
subsequently renamed in commit 92c58fd9.

Author: Peter Geoghegan
Reviewed-By: Jeff Davis, Álvaro Herrera
Discussion: https://postgr.es/m/9d9d1e1252a52ea1bad84ea40dbebfd54e672a0f.camel%40j-davis.com
Backpatch: 13-, where disk-based hash aggregation was introduced.

doc/src/sgml/config.sgml
src/backend/optimizer/path/costsize.c
src/backend/optimizer/plan/planner.c
src/backend/utils/misc/guc.c
src/include/optimizer/cost.h

index 6ce59078967ce2aaec510cf252a476453de486bf..822bbf1f27269fa13c0cc46bd80d4a338554fffd 100644 (file)
@@ -4840,23 +4840,6 @@ ANY <replaceable class="parameter">num_sync</replaceable> ( <replaceable class="
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-hashagg-avoid-disk-plan" xreflabel="hashagg_avoid_disk_plan">
-      <term><varname>hashagg_avoid_disk_plan</varname> (<type>boolean</type>)
-      <indexterm>
-       <primary><varname>hashagg_avoid_disk_plan</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        If set to <literal>on</literal>, causes the planner to avoid choosing
-        hashed aggregation plans that are expected to use the disk. If hashed
-        aggregation is chosen, it may still require the use of disk at
-        execution time, even if this parameter is enabled. The default is
-        <literal>off</literal>.
-       </para>
-      </listitem>
-     </varlistentry>
-
      </variablelist>
      </sect2>
      <sect2 id="runtime-config-query-constants">
index 945aa93374811f0216e1ad8b2ece7e1887b8b229..27ce4cc8069b255512123a55d3110802db78a2fd 100644 (file)
@@ -130,7 +130,6 @@ bool                enable_tidscan = true;
 bool           enable_sort = true;
 bool           enable_incremental_sort = true;
 bool           enable_hashagg = true;
-bool           hashagg_avoid_disk_plan = true;
 bool           enable_nestloop = true;
 bool           enable_material = true;
 bool           enable_mergejoin = true;
index b406d41e91891162e75895e185c0f9c28361a7b8..1345e522dcf5ec8cb1fbbd09cb65adf31b69a405 100644 (file)
@@ -4850,11 +4850,10 @@ create_distinct_paths(PlannerInfo *root,
         * Consider hash-based implementations of DISTINCT, if possible.
         *
         * If we were not able to make any other types of path, we *must* hash or
-        * die trying.  If we do have other choices, there are several things that
+        * die trying.  If we do have other choices, there are two things that
         * should prevent selection of hashing: if the query uses DISTINCT ON
         * (because it won't really have the expected behavior if we hash), or if
-        * enable_hashagg is off, or if it looks like the hashtable will exceed
-        * work_mem.
+        * enable_hashagg is off.
         *
         * Note: grouping_is_hashable() is much more expensive to check than the
         * other gating conditions, so we want to do it last.
@@ -4864,12 +4863,7 @@ create_distinct_paths(PlannerInfo *root,
        else if (parse->hasDistinctOn || !enable_hashagg)
                allow_hash = false;             /* policy-based decision not to hash */
        else
-       {
-               Size            hashentrysize = hash_agg_entry_size(0, cheapest_input_path->pathtarget->width, 0);
-
-               allow_hash = !hashagg_avoid_disk_plan ||
-                       (hashentrysize * numDistinctRows <= work_mem * 1024L);
-       }
+               allow_hash = true;              /* default */
 
        if (allow_hash && grouping_is_hashable(parse->distinctClause))
        {
@@ -6749,8 +6743,6 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel,
 
        if (can_hash)
        {
-               double          hashaggtablesize;
-
                if (parse->groupingSets)
                {
                        /*
@@ -6762,63 +6754,41 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel,
                }
                else
                {
-                       hashaggtablesize = estimate_hashagg_tablesize(cheapest_path,
-                                                                                                                 agg_costs,
-                                                                                                                 dNumGroups);
-
                        /*
-                        * Provided that the estimated size of the hashtable does not
-                        * exceed work_mem, we'll generate a HashAgg Path, although if we
-                        * were unable to sort above, then we'd better generate a Path, so
-                        * that we at least have one.
+                        * Generate a HashAgg Path.  We just need an Agg over the
+                        * cheapest-total input path, since input order won't matter.
                         */
-                       if (!hashagg_avoid_disk_plan ||
-                               hashaggtablesize < work_mem * 1024L ||
-                               grouped_rel->pathlist == NIL)
-                       {
-                               /*
-                                * We just need an Agg over the cheapest-total input path,
-                                * since input order won't matter.
-                                */
-                               add_path(grouped_rel, (Path *)
-                                                create_agg_path(root, grouped_rel,
-                                                                                cheapest_path,
-                                                                                grouped_rel->reltarget,
-                                                                                AGG_HASHED,
-                                                                                AGGSPLIT_SIMPLE,
-                                                                                parse->groupClause,
-                                                                                havingQual,
-                                                                                agg_costs,
-                                                                                dNumGroups));
-                       }
+                       add_path(grouped_rel, (Path *)
+                                        create_agg_path(root, grouped_rel,
+                                                                        cheapest_path,
+                                                                        grouped_rel->reltarget,
+                                                                        AGG_HASHED,
+                                                                        AGGSPLIT_SIMPLE,
+                                                                        parse->groupClause,
+                                                                        havingQual,
+                                                                        agg_costs,
+                                                                        dNumGroups));
                }
 
                /*
                 * Generate a Finalize HashAgg Path atop of the cheapest partially
-                * grouped path, assuming there is one. Once again, we'll only do this
-                * if it looks as though the hash table won't exceed work_mem.
+                * grouped path, assuming there is one
                 */
                if (partially_grouped_rel && partially_grouped_rel->pathlist)
                {
                        Path       *path = partially_grouped_rel->cheapest_total_path;
 
-                       hashaggtablesize = estimate_hashagg_tablesize(path,
-                                                                                                                 agg_final_costs,
-                                                                                                                 dNumGroups);
-
-                       if (!hashagg_avoid_disk_plan ||
-                               hashaggtablesize < work_mem * 1024L)
-                               add_path(grouped_rel, (Path *)
-                                                create_agg_path(root,
-                                                                                grouped_rel,
-                                                                                path,
-                                                                                grouped_rel->reltarget,
-                                                                                AGG_HASHED,
-                                                                                AGGSPLIT_FINAL_DESERIAL,
-                                                                                parse->groupClause,
-                                                                                havingQual,
-                                                                                agg_final_costs,
-                                                                                dNumGroups));
+                       add_path(grouped_rel, (Path *)
+                                        create_agg_path(root,
+                                                                        grouped_rel,
+                                                                        path,
+                                                                        grouped_rel->reltarget,
+                                                                        AGG_HASHED,
+                                                                        AGGSPLIT_FINAL_DESERIAL,
+                                                                        parse->groupClause,
+                                                                        havingQual,
+                                                                        agg_final_costs,
+                                                                        dNumGroups));
                }
        }
 
@@ -7171,65 +7141,43 @@ create_partial_grouping_paths(PlannerInfo *root,
                }
        }
 
+       /*
+        * Add a partially-grouped HashAgg Path where possible
+        */
        if (can_hash && cheapest_total_path != NULL)
        {
-               double          hashaggtablesize;
-
                /* Checked above */
                Assert(parse->hasAggs || parse->groupClause);
 
-               hashaggtablesize =
-                       estimate_hashagg_tablesize(cheapest_total_path,
-                                                                          agg_partial_costs,
-                                                                          dNumPartialGroups);
-
-               /*
-                * Tentatively produce a partial HashAgg Path, depending on if it
-                * looks as if the hash table will fit in work_mem.
-                */
-               if ((!hashagg_avoid_disk_plan || hashaggtablesize < work_mem * 1024L) &&
-                       cheapest_total_path != NULL)
-               {
-                       add_path(partially_grouped_rel, (Path *)
-                                        create_agg_path(root,
-                                                                        partially_grouped_rel,
-                                                                        cheapest_total_path,
-                                                                        partially_grouped_rel->reltarget,
-                                                                        AGG_HASHED,
-                                                                        AGGSPLIT_INITIAL_SERIAL,
-                                                                        parse->groupClause,
-                                                                        NIL,
-                                                                        agg_partial_costs,
-                                                                        dNumPartialGroups));
-               }
+               add_path(partially_grouped_rel, (Path *)
+                                create_agg_path(root,
+                                                                partially_grouped_rel,
+                                                                cheapest_total_path,
+                                                                partially_grouped_rel->reltarget,
+                                                                AGG_HASHED,
+                                                                AGGSPLIT_INITIAL_SERIAL,
+                                                                parse->groupClause,
+                                                                NIL,
+                                                                agg_partial_costs,
+                                                                dNumPartialGroups));
        }
 
+       /*
+        * Now add a partially-grouped HashAgg partial Path where possible
+        */
        if (can_hash && cheapest_partial_path != NULL)
        {
-               double          hashaggtablesize;
-
-               hashaggtablesize =
-                       estimate_hashagg_tablesize(cheapest_partial_path,
-                                                                          agg_partial_costs,
-                                                                          dNumPartialPartialGroups);
-
-               /* Do the same for partial paths. */
-               if ((!hashagg_avoid_disk_plan ||
-                        hashaggtablesize < work_mem * 1024L) &&
-                       cheapest_partial_path != NULL)
-               {
-                       add_partial_path(partially_grouped_rel, (Path *)
-                                                        create_agg_path(root,
-                                                                                        partially_grouped_rel,
-                                                                                        cheapest_partial_path,
-                                                                                        partially_grouped_rel->reltarget,
-                                                                                        AGG_HASHED,
-                                                                                        AGGSPLIT_INITIAL_SERIAL,
-                                                                                        parse->groupClause,
-                                                                                        NIL,
-                                                                                        agg_partial_costs,
-                                                                                        dNumPartialPartialGroups));
-               }
+               add_partial_path(partially_grouped_rel, (Path *)
+                                                create_agg_path(root,
+                                                                                partially_grouped_rel,
+                                                                                cheapest_partial_path,
+                                                                                partially_grouped_rel->reltarget,
+                                                                                AGG_HASHED,
+                                                                                AGGSPLIT_INITIAL_SERIAL,
+                                                                                parse->groupClause,
+                                                                                NIL,
+                                                                                agg_partial_costs,
+                                                                                dNumPartialPartialGroups));
        }
 
        /*
index 6f603cbbe8c837e8bcc0997dcd10d24df4b0642d..abfa95a2314bf04cc5140dd05ac8a9f75c8fc77c 100644 (file)
@@ -1006,16 +1006,6 @@ static struct config_bool ConfigureNamesBool[] =
                true,
                NULL, NULL, NULL
        },
-       {
-               {"hashagg_avoid_disk_plan", PGC_USERSET, QUERY_TUNING_METHOD,
-                       gettext_noop("Causes the planner to avoid hashed aggregation plans that are expected to use the disk."),
-                       NULL,
-                       GUC_EXPLAIN
-               },
-               &hashagg_avoid_disk_plan,
-               false,
-               NULL, NULL, NULL
-       },
        {
                {"enable_material", PGC_USERSET, QUERY_TUNING_METHOD,
                        gettext_noop("Enables the planner's use of materialization."),
index 613db8eab6882d2c1398e3134ef34f53ce8baa82..6141654e4783a7d44c58e69959811629cfc5845f 100644 (file)
@@ -55,7 +55,6 @@ extern PGDLLIMPORT bool enable_tidscan;
 extern PGDLLIMPORT bool enable_sort;
 extern PGDLLIMPORT bool enable_incremental_sort;
 extern PGDLLIMPORT bool enable_hashagg;
-extern PGDLLIMPORT bool hashagg_avoid_disk_plan;
 extern PGDLLIMPORT bool enable_nestloop;
 extern PGDLLIMPORT bool enable_material;
 extern PGDLLIMPORT bool enable_mergejoin;