]> granicus.if.org Git - postgresql/commitdiff
Fix brain fade in cost estimation for index-only scans.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 8 Oct 2011 14:41:17 +0000 (10:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 8 Oct 2011 14:41:17 +0000 (10:41 -0400)
visibility_fraction should not be applied to regular indexscans.
Noted by Cédric Villemain.

src/backend/optimizer/path/costsize.c

index e480797ca8eea0d3f2ff8044864dfd4d5c9a4b01..45c5524d3098feff130e2e7486717c5a5c57bb82 100644 (file)
@@ -264,6 +264,7 @@ cost_index(IndexPath *path, PlannerInfo *root,
 
        if (!enable_indexscan)
                startup_cost += disable_cost;
+       /* we don't need to check enable_indexonlyscan; indxpath.c does that */
 
        /*
         * Call index-access-method-specific code to estimate the processing cost
@@ -345,7 +346,8 @@ cost_index(IndexPath *path, PlannerInfo *root,
                                                                                        (double) index->pages,
                                                                                        root);
 
-               pages_fetched = ceil(pages_fetched * visibility_fraction);
+               if (indexonly)
+                       pages_fetched = ceil(pages_fetched * visibility_fraction);
 
                max_IO_cost = (pages_fetched * spc_random_page_cost) / num_scans;
 
@@ -366,7 +368,8 @@ cost_index(IndexPath *path, PlannerInfo *root,
                                                                                        (double) index->pages,
                                                                                        root);
 
-               pages_fetched = ceil(pages_fetched * visibility_fraction);
+               if (indexonly)
+                       pages_fetched = ceil(pages_fetched * visibility_fraction);
 
                min_IO_cost = (pages_fetched * spc_random_page_cost) / num_scans;
        }
@@ -381,7 +384,8 @@ cost_index(IndexPath *path, PlannerInfo *root,
                                                                                        (double) index->pages,
                                                                                        root);
 
-               pages_fetched = ceil(pages_fetched * visibility_fraction);
+               if (indexonly)
+                       pages_fetched = ceil(pages_fetched * visibility_fraction);
 
                /* max_IO_cost is for the perfectly uncorrelated case (csquared=0) */
                max_IO_cost = pages_fetched * spc_random_page_cost;
@@ -389,7 +393,8 @@ cost_index(IndexPath *path, PlannerInfo *root,
                /* min_IO_cost is for the perfectly correlated case (csquared=1) */
                pages_fetched = ceil(indexSelectivity * (double) baserel->pages);
 
-               pages_fetched = ceil(pages_fetched * visibility_fraction);
+               if (indexonly)
+                       pages_fetched = ceil(pages_fetched * visibility_fraction);
 
                min_IO_cost = spc_random_page_cost;
                if (pages_fetched > 1)