Fix brain fade in cost estimation for index-only scans.
authorTom Lane <[email protected]>
Sat, 8 Oct 2011 14:41:17 +0000 (10:41 -0400)
committerTom Lane <[email protected]>
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)