This patch makes a minor optimization to the restrpos() and markpos()
implementations for btree and hash: to bump the reference count on a
buffer, it is more efficient to use IncrBufferRefCount() than to do a
ReadBuffer (for one thing we needn't acquire the BufMgrLock; we also
don't need to do a hash table lookup etc.)

Barring any objections I will apply to HEAD before end of day.

-Neil

# 
# patch "src/backend/access/hash/hash.c"
#  from [932df947ff5d32c4a90f7231fe30451a8a3ca21f]
#    to [69c44f2b436d81702eccfd4010118ea9c14abbfd]
# 
# patch "src/backend/access/nbtree/nbtree.c"
#  from [a097527f8028f95b1e89eafa9fab335bc3e1e2d8]
#    to [786fcf3dbe60d1fb0142aaee8b62b3422d5ee0a7]
# 
--- src/backend/access/hash/hash.c
+++ src/backend/access/hash/hash.c
@@ -397,9 +397,8 @@
 	/* 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 @@
 	/* 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;
 	}
 
--- src/backend/access/nbtree/nbtree.c
+++ src/backend/access/nbtree/nbtree.c
@@ -477,8 +477,8 @@
 	/* 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 @@
 	/* 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;
 	}
---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
      joining column's datatypes do not match

Reply via email to