From: Tom Lane Date: Tue, 11 Oct 2011 19:00:30 +0000 (-0400) Subject: Consider index-only scans even when there is no matching qual or ORDER BY. X-Git-Tag: REL9_2_BETA1~997 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=600d3206d1b3f8b540397b79905486a536ac7f78;p=postgresql Consider index-only scans even when there is no matching qual or ORDER BY. By popular demand. --- diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 9ab146a1f7..ece326d885 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -317,8 +317,7 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel, bool useful_predicate; bool found_clause; bool index_is_ordered; - bool index_only_scan = false; - bool checked_index_only = false; + bool index_only_scan; /* * Check that index supports the desired scan type(s) @@ -436,17 +435,20 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel, } /* - * 3. Generate an indexscan path if there are relevant restriction + * 3. Check if an index-only scan is possible. + */ + index_only_scan = check_index_only(rel, index); + + /* + * 4. Generate an indexscan path if there are relevant restriction * clauses in the current clauses, OR the index ordering is * potentially useful for later merging or final output ordering, OR - * the index has a predicate that was proven by the current clauses. + * the index has a predicate that was proven by the current clauses, + * OR an index-only scan is possible. */ - if (found_clause || useful_pathkeys != NIL || useful_predicate) + if (found_clause || useful_pathkeys != NIL || useful_predicate || + index_only_scan) { - /* First, detect whether index-only scan is possible */ - index_only_scan = check_index_only(rel, index); - checked_index_only = true; - ipath = create_index_path(root, index, restrictclauses, orderbyclauses, @@ -460,7 +462,7 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel, } /* - * 4. If the index is ordered, a backwards scan might be interesting. + * 5. If the index is ordered, a backwards scan might be interesting. * Again, this is only interesting at top level. */ if (index_is_ordered && possibly_useful_pathkeys && @@ -472,9 +474,6 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel, index_pathkeys); if (useful_pathkeys != NIL) { - if (!checked_index_only) - index_only_scan = check_index_only(rel, index); - ipath = create_index_path(root, index, restrictclauses, NIL,