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
         */