]> granicus.if.org Git - postgresql/commitdiff
Prevent synchronous scan during GIN index build, because GIN is optimized
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 13 Nov 2008 17:42:10 +0000 (17:42 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 13 Nov 2008 17:42:10 +0000 (17:42 +0000)
for inserting tuples in increasing TID order.  It's not clear whether this
fully explains Ivan Sergio Borgonovo's complaint, but simple testing
confirms that a scan that doesn't start at block 0 can slow GIN build by
a factor of three or four.

Backpatch to 8.3.  Sync scan didn't exist before that.

src/backend/access/gin/gininsert.c
src/backend/access/gist/gist.c
src/backend/access/hash/hash.c
src/backend/access/nbtree/nbtree.c
src/backend/catalog/index.c
src/include/catalog/index.h

index 64099cd1e50cf10f2832cc723e0fdab2af424d60..6e0a194a69452938eb5872f54c0f91aabc7c68ab 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *                     $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.15 2008/09/30 10:52:10 heikki Exp $
+ *                     $PostgreSQL: pgsql/src/backend/access/gin/gininsert.c,v 1.16 2008/11/13 17:42:09 tgl Exp $
  *-------------------------------------------------------------------------
  */
 
@@ -340,8 +340,11 @@ ginbuild(PG_FUNCTION_ARGS)
        buildstate.accum.ginstate = &buildstate.ginstate;
        ginInitBA(&buildstate.accum);
 
-       /* do the heap scan */
-       reltuples = IndexBuildHeapScan(heap, index, indexInfo,
+       /*
+        * Do the heap scan.  We disallow sync scan here because dataPlaceToPage
+        * prefers to receive tuples in TID order.
+        */
+       reltuples = IndexBuildHeapScan(heap, index, indexInfo, false,
                                                                   ginBuildCallback, (void *) &buildstate);
 
        /* dump remaining entries to the index */
index e1f068ee7bcd7abdb40bd9b3375f94af94096390..1dff6d2f2ae9a6ddda9605d9e100e1d6293d67e1 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.153 2008/11/03 20:47:48 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/gist/gist.c,v 1.154 2008/11/13 17:42:09 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -152,7 +152,7 @@ gistbuild(PG_FUNCTION_ARGS)
        buildstate.tmpCtx = createTempGistContext();
 
        /* do the heap scan */
-       reltuples = IndexBuildHeapScan(heap, index, indexInfo,
+       reltuples = IndexBuildHeapScan(heap, index, indexInfo, true,
                                                                   gistbuildCallback, (void *) &buildstate);
 
        /* okay, all heap tuples are indexed */
index a24350367fc1a4f868d63191e7cdc7919cfd54bc..86d4df5e4dff8b09ce93f937ad1951cf86c16cb1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/hash/hash.c,v 1.106 2008/10/17 23:50:57 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/hash/hash.c,v 1.107 2008/11/13 17:42:10 tgl Exp $
  *
  * NOTES
  *       This file contains only the public interface routines.
@@ -93,7 +93,7 @@ hashbuild(PG_FUNCTION_ARGS)
        buildstate.indtuples = 0;
 
        /* do the heap scan */
-       reltuples = IndexBuildHeapScan(heap, index, indexInfo,
+       reltuples = IndexBuildHeapScan(heap, index, indexInfo, true,
                                                                   hashbuildCallback, (void *) &buildstate);
 
        if (buildstate.spool)
index f47a8e5f3648ae22c449c0ffbfa52b2befe7b171..bd486afabb7269c35baa2590f0f75544cb827db5 100644 (file)
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.164 2008/10/31 15:04:59 heikki Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/nbtree/nbtree.c,v 1.165 2008/11/13 17:42:10 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -122,7 +122,7 @@ btbuild(PG_FUNCTION_ARGS)
                buildstate.spool2 = _bt_spoolinit(index, false, true);
 
        /* do the heap scan */
-       reltuples = IndexBuildHeapScan(heap, index, indexInfo,
+       reltuples = IndexBuildHeapScan(heap, index, indexInfo, true,
                                                                   btbuildCallback, (void *) &buildstate);
 
        /* okay, all heap tuples are indexed */
index 7c0c313e91b520c082fcae4e562f8cdaf1622ef5..0ad1e04a748ae15a60b0aa67eb951c346a5c6455 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.307 2008/11/02 01:45:27 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.308 2008/11/13 17:42:10 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1513,6 +1513,7 @@ double
 IndexBuildHeapScan(Relation heapRelation,
                                   Relation indexRelation,
                                   IndexInfo *indexInfo,
+                                  bool allow_sync,
                                   IndexBuildCallback callback,
                                   void *callback_state)
 {
@@ -1575,7 +1576,12 @@ IndexBuildHeapScan(Relation heapRelation,
                OldestXmin = GetOldestXmin(heapRelation->rd_rel->relisshared, true);
        }
 
-       scan = heap_beginscan(heapRelation, snapshot, 0, NULL);
+       scan = heap_beginscan_strat(heapRelation,       /* relation */
+                                                               snapshot,               /* snapshot */
+                                                               0,                              /* number of keys */
+                                                               NULL,                   /* scan key */
+                                                               true,                   /* buffer access strategy OK */
+                                                               allow_sync);    /* syncscan OK? */
 
        reltuples = 0;
 
index a5ab195c233d92eac2332e537a376bb1c70241fb..939c47cd916e2bfa0849dbb7bb87e83fb7c5d5e0 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.75 2008/01/01 19:45:56 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.76 2008/11/13 17:42:10 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -63,6 +63,7 @@ extern void index_build(Relation heapRelation,
 extern double IndexBuildHeapScan(Relation heapRelation,
                                   Relation indexRelation,
                                   IndexInfo *indexInfo,
+                                  bool allow_sync,
                                   IndexBuildCallback callback,
                                   void *callback_state);