Skip to content

Commit 600d320

Browse files
committed
Consider index-only scans even when there is no matching qual or ORDER BY.
By popular demand.
1 parent a018546 commit 600d320

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

src/backend/optimizer/path/indxpath.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,7 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
317317
bool useful_predicate;
318318
bool found_clause;
319319
bool index_is_ordered;
320-
bool index_only_scan = false;
321-
bool checked_index_only = false;
320+
bool index_only_scan;
322321

323322
/*
324323
* Check that index supports the desired scan type(s)
@@ -436,17 +435,20 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
436435
}
437436

438437
/*
439-
* 3. Generate an indexscan path if there are relevant restriction
438+
* 3. Check if an index-only scan is possible.
439+
*/
440+
index_only_scan = check_index_only(rel, index);
441+
442+
/*
443+
* 4. Generate an indexscan path if there are relevant restriction
440444
* clauses in the current clauses, OR the index ordering is
441445
* potentially useful for later merging or final output ordering, OR
442-
* the index has a predicate that was proven by the current clauses.
446+
* the index has a predicate that was proven by the current clauses,
447+
* OR an index-only scan is possible.
443448
*/
444-
if (found_clause || useful_pathkeys != NIL || useful_predicate)
449+
if (found_clause || useful_pathkeys != NIL || useful_predicate ||
450+
index_only_scan)
445451
{
446-
/* First, detect whether index-only scan is possible */
447-
index_only_scan = check_index_only(rel, index);
448-
checked_index_only = true;
449-
450452
ipath = create_index_path(root, index,
451453
restrictclauses,
452454
orderbyclauses,
@@ -460,7 +462,7 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
460462
}
461463

462464
/*
463-
* 4. If the index is ordered, a backwards scan might be interesting.
465+
* 5. If the index is ordered, a backwards scan might be interesting.
464466
* Again, this is only interesting at top level.
465467
*/
466468
if (index_is_ordered && possibly_useful_pathkeys &&
@@ -472,9 +474,6 @@ find_usable_indexes(PlannerInfo *root, RelOptInfo *rel,
472474
index_pathkeys);
473475
if (useful_pathkeys != NIL)
474476
{
475-
if (!checked_index_only)
476-
index_only_scan = check_index_only(rel, index);
477-
478477
ipath = create_index_path(root, index,
479478
restrictclauses,
480479
NIL,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy