diff options
author | Tom Lane | 2008-11-13 17:42:19 +0000 |
---|---|---|
committer | Tom Lane | 2008-11-13 17:42:19 +0000 |
commit | f7d4fb4e662f73a5a5af6fcf76e8494086814805 (patch) | |
tree | a44bf374c4900b5ded751a72b9330dd3f6cd91d4 | |
parent | be664274bf0e5ed79e642f155b629d8532cc2c73 (diff) |
Prevent synchronous scan during GIN index build, because GIN is optimized
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.
-rw-r--r-- | src/backend/access/gin/gininsert.c | 7 | ||||
-rw-r--r-- | src/backend/access/gist/gist.c | 2 | ||||
-rw-r--r-- | src/backend/access/hash/hash.c | 2 | ||||
-rw-r--r-- | src/backend/access/nbtree/nbtree.c | 2 | ||||
-rw-r--r-- | src/backend/catalog/index.c | 8 | ||||
-rw-r--r-- | src/include/catalog/index.h | 1 |
6 files changed, 16 insertions, 6 deletions
diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c index 1942da1a45..dd805c9f8f 100644 --- a/src/backend/access/gin/gininsert.c +++ b/src/backend/access/gin/gininsert.c @@ -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 */ diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 9a53941715..58050803be 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -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 */ diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index 84e6617aab..c2c2759fc8 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -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) diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index 366da36517..825ff5c6a2 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -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 */ diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 65da5239a9..90c07b6b0b 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -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; diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index b18ccb3bea..322f1a991c 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -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); |