heap pruning: Only call BufferGetBlockNumber() once.
authorAndres Freund <andres@anarazel.de>
Mon, 17 Jan 2022 23:31:28 +0000 (15:31 -0800)
committerAndres Freund <andres@anarazel.de>
Mon, 17 Jan 2022 23:35:11 +0000 (15:35 -0800)
BufferGetBlockNumber() is not that cheap and obviously cannot change during
one heap_prune_page(), so only call it once. We might be able to do better and
pass the block number from the caller, but that'd be a larger change...

Discussion: https://postgr.es/m/20211211045710.ljtuu4gfloh754rs@alap3.anarazel.de

src/backend/access/heap/pruneheap.c

index 3201fcc52b097764c6e493c956dff7af0053e2a6..b3e2eec52fa3be702e3423df2a19875fb8be4de9 100644 (file)
@@ -269,6 +269,7 @@ heap_page_prune(Relation relation, Buffer buffer,
 {
        int                     ndeleted = 0;
        Page            page = BufferGetPage(buffer);
+       BlockNumber blockno = BufferGetBlockNumber(buffer);
        OffsetNumber offnum,
                                maxoff;
        PruneState      prstate;
@@ -335,7 +336,7 @@ heap_page_prune(Relation relation, Buffer buffer,
                htup = (HeapTupleHeader) PageGetItem(page, itemid);
                tup.t_data = htup;
                tup.t_len = ItemIdGetLength(itemid);
-               ItemPointerSet(&(tup.t_self), BufferGetBlockNumber(buffer), offnum);
+               ItemPointerSet(&(tup.t_self), blockno, offnum);
 
                /*
                 * Set the offset number so that we can display it along with any