aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-04-21 06:18:52 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-04-21 06:18:52 +0000
commit48239e156ff83dbd54f0efe8b382822c2f9890e4 (patch)
treed29b4e90d47302e140f7e821494d5a135a091222 /src
parent925ca9d7de97529591d83f7c7f6c9bdef66afeae (diff)
downloadpostgresql-48239e156ff83dbd54f0efe8b382822c2f9890e4.tar.gz
postgresql-48239e156ff83dbd54f0efe8b382822c2f9890e4.zip
Avoid useless work during set_plain_rel_pathlist() when the relation
will be excluded by constraint exclusion anyway. Greg Stark
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/path/allpaths.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 7aa2bd7e6fb..0d87291025f 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.161 2007/02/22 22:00:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.162 2007/04/21 06:18:52 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -196,20 +196,6 @@ set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti)
static void
set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
{
- /* Mark rel with estimated output rows, width, etc */
- set_baserel_size_estimates(root, rel);
-
- /* Test any partial indexes of rel for applicability */
- check_partial_indexes(root, rel);
-
- /*
- * Check to see if we can extract any restriction conditions from join
- * quals that are OR-of-AND structures. If so, add them to the rel's
- * restriction list, and recompute the size estimates.
- */
- if (create_or_index_quals(root, rel))
- set_baserel_size_estimates(root, rel);
-
/*
* If we can prove we don't need to scan the rel via constraint exclusion,
* set up a single dummy path for it. (Rather than inventing a special
@@ -217,8 +203,9 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
*/
if (relation_excluded_by_constraints(rel, rte))
{
- /* Reset output-rows estimate to 0 */
+ /* Set dummy size estimates --- we leave attr_widths[] as zeroes */
rel->rows = 0;
+ rel->width = 0;
add_path(rel, (Path *) create_append_path(rel, NIL));
@@ -228,6 +215,20 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
return;
}
+ /* Mark rel with estimated output rows, width, etc */
+ set_baserel_size_estimates(root, rel);
+
+ /* Test any partial indexes of rel for applicability */
+ check_partial_indexes(root, rel);
+
+ /*
+ * Check to see if we can extract any restriction conditions from join
+ * quals that are OR-of-AND structures. If so, add them to the rel's
+ * restriction list, and recompute the size estimates.
+ */
+ if (create_or_index_quals(root, rel))
+ set_baserel_size_estimates(root, rel);
+
/*
* Generate paths and add them to the rel's pathlist.
*
@@ -369,7 +370,8 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
/*
* Propagate size information from the child back to the parent. For
* simplicity, we use the largest widths from any child as the parent
- * estimates.
+ * estimates. (If you want to change this, beware of child
+ * attr_widths[] entries that haven't been set and are still 0.)
*/
rel->rows += childrel->rows;
if (childrel->width > rel->width)