diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-06-27 03:56:55 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-06-27 03:56:55 +0000 |
commit | 2c2161a47d4765842868b019bb1814495863127c (patch) | |
tree | 460f24fa38eef370db06c7623e34612f769b7ab1 /src/backend/optimizer/plan/createplan.c | |
parent | f95b5334a759c9e225a6c8e701899c5cd601541a (diff) | |
download | postgresql-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.c | 13 |
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; |