When using the WAL-logged CREATE DATABASE strategy, bulk extend.
authorRobert Haas <rhaas@postgresql.org>
Thu, 18 Aug 2022 15:09:39 +0000 (11:09 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 18 Aug 2022 15:26:34 +0000 (11:26 -0400)
This should improve performance, and was suggested by Andres Freund.
Back-patch to v15 to keep the code consistent across branches.

Dilip Kumar

Discussion: http://postgr.es/m/C3458199-FEDD-4356-865A-08DFAA5D4065@anarazel.de
Discussion: http://postgr.es/m/CAFiTN-sJ0vVpJrZ=R5M+g7Tr8=NN4wKOtrqOcDEsfFfnZgivVA@mail.gmail.com

src/backend/storage/buffer/bufmgr.c

index 9c1bd508d36fd3c63dc9bd38eecb3f7774443652..7a1202c6096e392901c9aa25e3d1094ae1b6634b 100644 (file)
@@ -3712,6 +3712,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator,
    bool        use_wal;
    BlockNumber nblocks;
    BlockNumber blkno;
+   PGAlignedBlock buf;
    BufferAccessStrategy bstrategy_src;
    BufferAccessStrategy bstrategy_dst;
 
@@ -3730,6 +3731,14 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator,
    if (nblocks == 0)
        return;
 
+   /*
+    * Bulk extend the destination relation of the same size as the source
+    * relation before starting to copy block by block.
+    */
+   memset(buf.data, 0, BLCKSZ);
+   smgrextend(smgropen(dstlocator, InvalidBackendId), forkNum, nblocks - 1,
+              buf.data, true);
+
    /* This is a bulk operation, so use buffer access strategies. */
    bstrategy_src = GetAccessStrategy(BAS_BULKREAD);
    bstrategy_dst = GetAccessStrategy(BAS_BULKWRITE);
@@ -3747,7 +3756,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator,
        srcPage = BufferGetPage(srcBuf);
 
        /* Use P_NEW to extend the destination relation. */
-       dstBuf = ReadBufferWithoutRelcache(dstlocator, forkNum, P_NEW,
+       dstBuf = ReadBufferWithoutRelcache(dstlocator, forkNum, blkno,
                                           RBM_NORMAL, bstrategy_dst,
                                           permanent);
        LockBuffer(dstBuf, BUFFER_LOCK_EXCLUSIVE);