Consider index-only scans even when there is no matching qual or ORDER BY.

By popular demand.
This commit is contained in:
Tom Lane 2011-10-11 15:00:30 -04:00
parent a0185461dd
commit 600d3206d1
1 changed files with 12 additions and 13 deletions

View File

@ -317,8 +317,7 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
bool useful_predicate; bool useful_predicate;
bool found_clause; bool found_clause;
bool index_is_ordered; bool index_is_ordered;
bool index_only_scan = false; bool index_only_scan;
bool checked_index_only = false;
/* /*
* Check that index supports the desired scan type(s) * 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 * clauses in the current clauses, OR the index ordering is
* potentially useful for later merging or final output ordering, OR * 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, ipath = create_index_path(root, index,
restrictclauses, restrictclauses,
orderbyclauses, 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. * Again, this is only interesting at top level.
*/ */
if (index_is_ordered && possibly_useful_pathkeys && if (index_is_ordered && possibly_useful_pathkeys &&
@ -472,9 +474,6 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
index_pathkeys); index_pathkeys);
if (useful_pathkeys != NIL) if (useful_pathkeys != NIL)
{ {
if (!checked_index_only)
index_only_scan = check_index_only(rel, index);
ipath = create_index_path(root, index, ipath = create_index_path(root, index,
restrictclauses, restrictclauses,
NIL, NIL,