diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-02-05 19:38:58 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-02-05 19:38:58 +0000 |
commit | 12179c99b13067c170ae9d1c8fa2c93c01a21f94 (patch) | |
tree | 3a43cdcd3ea0b865a070b04f4fcde3249934236b /src/backend/access/gist/gistget.c | |
parent | 11635c3f6fe1961dddc1155dfc4de145fa007c88 (diff) | |
download | postgresql-12179c99b13067c170ae9d1c8fa2c93c01a21f94.tar.gz |
Marginal hack to merge adjacent ReleaseBuffer/ReadBuffer calls into
ReleaseAndReadBuffer during GIST index searches. We already did this
in btree and rtree, might as well do it here too.
Diffstat (limited to 'src/backend/access/gist/gistget.c')
-rw-r--r-- | src/backend/access/gist/gistget.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index 70febc584c..03856874f3 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.43 2004/12/31 21:59:10 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.44 2005/02/05 19:38:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -60,10 +60,11 @@ gistfirst(IndexScanDesc s, ScanDirection dir) BlockNumber blk; IndexTuple it; + so = (GISTScanOpaque) s->opaque; + b = ReadBuffer(s->indexRelation, GISTP_ROOT); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); - so = (GISTScanOpaque) s->opaque; for (;;) { @@ -75,12 +76,14 @@ gistfirst(IndexScanDesc s, ScanDirection dir) while (n < FirstOffsetNumber || n > maxoff) { - ReleaseBuffer(b); - if (so->s_stack == NULL) + stk = so->s_stack; + if (stk == NULL) + { + ReleaseBuffer(b); return false; + } - stk = so->s_stack; - b = ReadBuffer(s->indexRelation, stk->gs_blk); + b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); maxoff = PageGetMaxOffsetNumber(p); @@ -89,6 +92,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir) n = OffsetNumberPrev(stk->gs_child); else n = OffsetNumberNext(stk->gs_child); + so->s_stack = stk->gs_parent; pfree(stk); @@ -116,8 +120,7 @@ gistfirst(IndexScanDesc s, ScanDirection dir) it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); blk = ItemPointerGetBlockNumber(&(it->t_tid)); - ReleaseBuffer(b); - b = ReadBuffer(s->indexRelation, blk); + b = ReleaseAndReadBuffer(b, s->indexRelation, blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); } @@ -137,6 +140,8 @@ gistnext(IndexScanDesc s, ScanDirection dir) BlockNumber blk; IndexTuple it; + so = (GISTScanOpaque) s->opaque; + blk = ItemPointerGetBlockNumber(&(s->currentItemData)); n = ItemPointerGetOffsetNumber(&(s->currentItemData)); @@ -148,7 +153,6 @@ gistnext(IndexScanDesc s, ScanDirection dir) b = ReadBuffer(s->indexRelation, blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); - so = (GISTScanOpaque) s->opaque; for (;;) { @@ -157,20 +161,23 @@ gistnext(IndexScanDesc s, ScanDirection dir) while (n < FirstOffsetNumber || n > maxoff) { - ReleaseBuffer(b); - if (so->s_stack == NULL) + stk = so->s_stack; + if (stk == NULL) + { + ReleaseBuffer(b); return false; + } - stk = so->s_stack; - b = ReadBuffer(s->indexRelation, stk->gs_blk); + b = ReleaseAndReadBuffer(b, s->indexRelation, stk->gs_blk); p = BufferGetPage(b); - maxoff = PageGetMaxOffsetNumber(p); po = (GISTPageOpaque) PageGetSpecialPointer(p); + maxoff = PageGetMaxOffsetNumber(p); if (ScanDirectionIsBackward(dir)) n = OffsetNumberPrev(stk->gs_child); else n = OffsetNumberNext(stk->gs_child); + so->s_stack = stk->gs_parent; pfree(stk); @@ -198,8 +205,7 @@ gistnext(IndexScanDesc s, ScanDirection dir) it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); blk = ItemPointerGetBlockNumber(&(it->t_tid)); - ReleaseBuffer(b); - b = ReadBuffer(s->indexRelation, blk); + b = ReleaseAndReadBuffer(b, s->indexRelation, blk); p = BufferGetPage(b); po = (GISTPageOpaque) PageGetSpecialPointer(p); |