]> granicus.if.org Git - postgresql/commitdiff
Avoid useless work during set_plain_rel_pathlist() when the relation
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 21 Apr 2007 06:18:52 +0000 (06:18 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 21 Apr 2007 06:18:52 +0000 (06:18 +0000)
will be excluded by constraint exclusion anyway.  Greg Stark

src/backend/optimizer/path/allpaths.c

index 7aa2bd7e6fb2c050aefce6853fe93da4ea5ddee9..0d87291025f5e08f7b9c447cb8db8033c74e221c 100644 (file)
@@ -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)