]> granicus.if.org Git - postgresql/commitdiff
Adjust OR indexscan logic to not generate redundant condition-free OR
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 1 Mar 2005 01:40:05 +0000 (01:40 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 1 Mar 2005 01:40:05 +0000 (01:40 +0000)
indexscans involving partial indexes.  These would always be dominated
by a simple indexscan on such an index, so there's no point in considering
them.  Fixes overoptimism in a patch I applied last October.

src/backend/optimizer/path/orindxpath.c

index 210abfe1d9e779d2b4687905203a42940a6bec55..ffd08c738cb7486ace9af3cfab6875bdb8d6b041 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.64 2004/12/31 22:00:04 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.65 2005/03/01 01:40:05 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -387,10 +387,14 @@ best_or_subclause_index(Query *root,
 
                /*
                 * Ignore index if it doesn't match the subclause at all; except
-                * that if it's a partial index, consider it anyway, since the
-                * selectivity of the predicate alone might make the index useful.
+                * that if it's a partial index matching the current OR subclause,
+                * consider it anyway, since effectively we are using the index
+                * predicate to match the subclause.  (Note: we exclude partial
+                * indexes that are predOK; else such a partial index would be
+                * considered to match *every* OR subclause, generating bogus OR
+                * plans that are redundant with the basic scan on that index.)
                 */
-               if (indexclauses == NIL && index->indpred == NIL)
+               if (indexclauses == NIL && (index->indpred == NIL || index->predOK))
                        continue;
 
                /* Convert clauses to indexquals the executor can handle */