Micro-optimization of markpos() and restrpos() in btree and hash indexes.
authorNeil Conway <neilc@samurai.com>
Wed, 17 Nov 2004 03:13:38 +0000 (03:13 +0000)
committerNeil Conway <neilc@samurai.com>
Wed, 17 Nov 2004 03:13:38 +0000 (03:13 +0000)
Rather than using ReadBuffer() to increment the reference count on an
already-pinned buffer, we should use IncrBufferRefCount() as it is
faster and does not require acquiring the BufMgrLock.

src/backend/access/hash/hash.c
src/backend/access/nbtree/nbtree.c

index de4058a0f603284791c7a43acaf03bbfff05a8e7..56233426ea290decaa6017e1c125d7f235fd6d7c 100644 (file)
@@ -397,9 +397,8 @@ hashmarkpos(PG_FUNCTION_ARGS)
        /* bump pin count on currentItemData and copy to currentMarkData */
        if (ItemPointerIsValid(&(scan->currentItemData)))
        {
-               so->hashso_mrkbuf = _hash_getbuf(rel,
-                                                                BufferGetBlockNumber(so->hashso_curbuf),
-                                                                                HASH_NOLOCK);
+               IncrBufferRefCount(so->hashso_curbuf);
+               so->hashso_mrkbuf = so->hashso_curbuf;
                scan->currentMarkData = scan->currentItemData;
        }
 
@@ -425,9 +424,8 @@ hashrestrpos(PG_FUNCTION_ARGS)
        /* bump pin count on currentMarkData and copy to currentItemData */
        if (ItemPointerIsValid(&(scan->currentMarkData)))
        {
-               so->hashso_curbuf = _hash_getbuf(rel,
-                                                                BufferGetBlockNumber(so->hashso_mrkbuf),
-                                                                                HASH_NOLOCK);
+               IncrBufferRefCount(so->hashso_mrkbuf);
+               so->hashso_curbuf = so->hashso_mrkbuf;
                scan->currentItemData = scan->currentMarkData;
        }
 
index bbf6d6c9490fb797594f122298f140b8c4990781..43475359a539117445f9b441ddb67da7e3a9ca42 100644 (file)
@@ -477,8 +477,8 @@ btmarkpos(PG_FUNCTION_ARGS)
        /* bump pin on current buffer for assignment to mark buffer */
        if (ItemPointerIsValid(&(scan->currentItemData)))
        {
-               so->btso_mrkbuf = ReadBuffer(scan->indexRelation,
-                                                                 BufferGetBlockNumber(so->btso_curbuf));
+               IncrBufferRefCount(so->btso_curbuf);
+               so->btso_mrkbuf = so->btso_curbuf;
                scan->currentMarkData = scan->currentItemData;
                so->mrkHeapIptr = so->curHeapIptr;
        }
@@ -509,8 +509,8 @@ btrestrpos(PG_FUNCTION_ARGS)
        /* bump pin on marked buffer */
        if (ItemPointerIsValid(&(scan->currentMarkData)))
        {
-               so->btso_curbuf = ReadBuffer(scan->indexRelation,
-                                                                 BufferGetBlockNumber(so->btso_mrkbuf));
+               IncrBufferRefCount(so->btso_mrkbuf);
+               so->btso_curbuf = so->btso_mrkbuf;
                scan->currentItemData = scan->currentMarkData;
                so->curHeapIptr = so->mrkHeapIptr;
        }