From 1c1ecd5124068a45fdecc0dcc4ba2581c15acf9f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 28 Jun 2006 20:04:38 +0000 Subject: [PATCH] Improve planner estimates for size of tuple hash tables. --- src/backend/optimizer/plan/planner.c | 4 ++-- src/backend/optimizer/plan/subselect.c | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index ea6a052918..da1cadcd0d 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -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 */ diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 1b5533cded..c1304042a1 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -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; -- 2.40.0