]> granicus.if.org Git - postgresql/commitdiff
Improve planner estimates for size of tuple hash tables.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 Jun 2006 20:04:38 +0000 (20:04 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 28 Jun 2006 20:04:38 +0000 (20:04 +0000)
src/backend/optimizer/plan/planner.c
src/backend/optimizer/plan/subselect.c

index ea6a052918ec3aebedda2a85b84dc5f83b1b4064..da1cadcd0db83998ad9acf7bf9d4be285598deec 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.199 2006/03/05 15:58:29 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.200 2006/06/28 20:04:38 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1298,7 +1298,7 @@ choose_hashed_grouping(PlannerInfo *root, double tuple_fraction,
        }
 
        /* Estimate per-hash-entry space at tuple width... */
-       hashentrysize = cheapest_path_width;
+       hashentrysize = MAXALIGN(cheapest_path_width) + MAXALIGN(sizeof(MinimalTupleData));
        /* plus space for pass-by-ref transition values... */
        hashentrysize += agg_counts->transitionSpace;
        /* plus the per-hash-entry overhead */
index 1b5533cded4a06d6a628552383efd5ae767c64dd..c1304042a1d3c407b6859066720a27d02b118429 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.107 2006/05/03 00:24:56 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.108 2006/06/28 20:04:38 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -585,11 +585,13 @@ subplan_is_hashable(SubLink *slink, SubPlan *node)
                return false;
 
        /*
-        * The estimated size of the subquery result must fit in work_mem. (XXX
-        * what about hashtable overhead?)
+        * The estimated size of the subquery result must fit in work_mem.
+        * (Note: we use sizeof(HeapTupleHeaderData) here even though the tuples
+        * will actually be stored as MinimalTuples; this provides some fudge
+        * factor for hashtable overhead.)
         */
        subquery_size = node->plan->plan_rows *
-               (MAXALIGN(node->plan->plan_width) + MAXALIGN(sizeof(HeapTupleData)));
+               (MAXALIGN(node->plan->plan_width) + MAXALIGN(sizeof(HeapTupleHeaderData)));
        if (subquery_size > work_mem * 1024L)
                return false;