]> granicus.if.org Git - postgresql/commitdiff
Tweak order of operations in BitmapHeapNext() to avoid the case of prefetching
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 12 Jan 2009 16:00:41 +0000 (16:00 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 12 Jan 2009 16:00:41 +0000 (16:00 +0000)
the same page we are nanoseconds away from reading for real.  There should be
something left to do on the current page before we consider issuing a prefetch.

src/backend/executor/nodeBitmapHeapscan.c

index 2ba8b89ee359c2910ce582d810ea51679fd39a60..b2aad2133c27e823e87974cdc71a07e894899628 100644 (file)
@@ -21,7 +21,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.33 2009/01/12 05:10:44 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.34 2009/01/12 16:00:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -236,10 +236,22 @@ BitmapHeapNext(BitmapHeapScanState *node)
 #endif /* USE_PREFETCH */
                }
 
+               /*
+                * Out of range?  If so, nothing more to look at on this page
+                */
+               if (scan->rs_cindex < 0 || scan->rs_cindex >= scan->rs_ntuples)
+               {
+                       node->tbmres = tbmres = NULL;
+                       continue;
+               }
+
 #ifdef USE_PREFETCH
                /*
                 * We issue prefetch requests *after* fetching the current page
                 * to try to avoid having prefetching interfere with the main I/O.
+                * Also, this should happen only when we have determined there is
+                * still something to do on the current page, else we may uselessly
+                * prefetch the same page we are just about to request for real.
                 */
                if (prefetch_iterator)
                {
@@ -260,15 +272,6 @@ BitmapHeapNext(BitmapHeapScanState *node)
                }
 #endif /* USE_PREFETCH */
 
-               /*
-                * Out of range?  If so, nothing more to look at on this page
-                */
-               if (scan->rs_cindex < 0 || scan->rs_cindex >= scan->rs_ntuples)
-               {
-                       node->tbmres = tbmres = NULL;
-                       continue;
-               }
-
                /*
                 * Okay to fetch the tuple
                 */