aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/createplan.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2008-06-27 03:56:55 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2008-06-27 03:56:55 +0000
commit2c2161a47d4765842868b019bb1814495863127c (patch)
tree460f24fa38eef370db06c7623e34612f769b7ab1 /src/backend/optimizer/plan/createplan.c
parentf95b5334a759c9e225a6c8e701899c5cd601541a (diff)
downloadpostgresql-2c2161a47d4765842868b019bb1814495863127c.tar.gz
postgresql-2c2161a47d4765842868b019bb1814495863127c.zip
Improve planner's estimation of the size of an append relation: rather than
taking the maximum of any child rel's width, we should weight the widths proportionally to the number of rows expected from each child. In hindsight this is obviously correct because row width is really a proxy for the total physical size of the relation. Per discussion with Scott Carey (bug #4264).
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r--src/backend/optimizer/plan/createplan.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 109a0145475..0884cda6070 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -10,13 +10,14 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.240 2008/04/17 21:22:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.241 2008/06/27 03:56:55 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include <limits.h>
+#include <math.h>
#include "access/skey.h"
#include "nodes/makefuncs.h"
@@ -2312,6 +2313,7 @@ make_append(List *appendplans, bool isTarget, List *tlist)
{
Append *node = makeNode(Append);
Plan *plan = &node->plan;
+ double total_size;
ListCell *subnode;
/*
@@ -2322,7 +2324,7 @@ make_append(List *appendplans, bool isTarget, List *tlist)
plan->startup_cost = 0;
plan->total_cost = 0;
plan->plan_rows = 0;
- plan->plan_width = 0;
+ total_size = 0;
foreach(subnode, appendplans)
{
Plan *subplan = (Plan *) lfirst(subnode);
@@ -2331,9 +2333,12 @@ make_append(List *appendplans, bool isTarget, List *tlist)
plan->startup_cost = subplan->startup_cost;
plan->total_cost += subplan->total_cost;
plan->plan_rows += subplan->plan_rows;
- if (plan->plan_width < subplan->plan_width)
- plan->plan_width = subplan->plan_width;
+ total_size += subplan->plan_width * subplan->plan_rows;
}
+ if (plan->plan_rows > 0)
+ plan->plan_width = rint(total_size / plan->plan_rows);
+ else
+ plan->plan_width = 0;
plan->targetlist = tlist;
plan->qual = NIL;