heapam: WIP: cacheline prefetching for hot pruning.
authorAndres Freund <[email protected]>
Thu, 28 May 2020 21:51:58 +0000 (14:51 -0700)
committerAndres Freund <[email protected]>
Mon, 11 Jan 2021 23:09:14 +0000 (15:09 -0800)
Author: Andres Freund, with contributions from Dmitry Dolgov
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:

fixup! heapam: WIP: cacheline prefetching for hot pruning.

src/backend/access/heap/pruneheap.c

index cdba58096a2c149b851e401259bf0b086b937342..3e0eae69a99ec854a7737fbdb4c68dabaf48077e 100644 (file)
@@ -256,8 +256,32 @@ heap_page_prune(Relation relation, Buffer buffer,
    prstate.nredirected = prstate.ndead = prstate.nunused = 0;
    memset(prstate.marked, 0, sizeof(prstate.marked));
 
-   /* Scan the page */
    maxoff = PageGetMaxOffsetNumber(page);
+
+#if 1
+   for (char *p = (char *) PageGetItemId(page, FirstOffsetNumber);
+        p < (char *) PageGetItemId(page, maxoff);
+        p += 64)
+   {
+       __builtin_prefetch((ItemId)p);
+   }
+
+   for (offnum = FirstOffsetNumber;
+        offnum <= maxoff;
+        offnum = OffsetNumberNext(offnum))
+   {
+       ItemId      itemid;
+
+       itemid = PageGetItemId(page, offnum);
+       if (!ItemIdIsUsed(itemid) || ItemIdIsDead(itemid) || !ItemIdHasStorage(itemid))
+           continue;
+
+       __builtin_prefetch((HeapTupleHeader) PageGetItem(page, itemid));
+       __builtin_prefetch(PageGetItem(page, itemid) + sizeof(HeapTupleHeaderData) - 1);
+   }
+#endif
+
+   /* Scan the page */
    for (offnum = FirstOffsetNumber;
         offnum <= maxoff;
         offnum = OffsetNumberNext(offnum))