]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
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:22:48 +0000 (11:22 -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 43d3c8caaa68893c7db39561550a3decde677933..8727a50d9496bb2c061c7015b8a3f3659394db8a 100644 (file)
@@ -3713,6 +3713,7 @@ RelationCopyStorageUsingBuffer(RelFileNode srcnode,
        bool            use_wal;
        BlockNumber nblocks;
        BlockNumber blkno;
+       PGAlignedBlock buf;
        BufferAccessStrategy bstrategy_src;
        BufferAccessStrategy bstrategy_dst;
 
@@ -3731,6 +3732,14 @@ RelationCopyStorageUsingBuffer(RelFileNode srcnode,
        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(dstnode, 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);
@@ -3748,7 +3757,7 @@ RelationCopyStorageUsingBuffer(RelFileNode srcnode,
                srcPage = BufferGetPage(srcBuf);
 
                /* Use P_NEW to extend the destination relation. */
-               dstBuf = ReadBufferWithoutRelcache(dstnode, forkNum, P_NEW,
+               dstBuf = ReadBufferWithoutRelcache(dstnode, forkNum, blkno,
                                                                                   RBM_NORMAL, bstrategy_dst,
                                                                                   permanent);
                LockBuffer(dstBuf, BUFFER_LOCK_EXCLUSIVE);