diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index cb07694aea..cf55ce6e9f 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -57,6 +57,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "storage/spin.h"
+#include "storage/standby.h"
 #include "utils/builtins.h"
 #include "utils/datetime.h"
 #include "utils/guc_hooks.h"
@@ -3836,6 +3837,9 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
 						streaming_reply_sent = true;
 					}
 
+					/* Do any background tasks that might benefit us later */
+					StartupProcessIdleMaintenance();
+
 					/* Update pg_stat_recovery_prefetch before sleeping. */
 					XLogPrefetcherComputeStats(xlogprefetcher);
 
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 9e8b6756fe..976a06e5a3 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -62,6 +62,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "storage/spin.h"
+#include "storage/standby.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
 #include "utils/rel.h"
@@ -4586,6 +4587,11 @@ ExpireOldKnownAssignedTransactionIds(TransactionId xid)
  * currently valid XIDs in the array.
  */
 
+void
+StartupProcessIdleMaintenance(void)
+{
+	KnownAssignedXidsCompress(true);
+}
 
 /*
  * Compress KnownAssignedXids by shifting valid data down to the start of the
@@ -4995,8 +5001,7 @@ KnownAssignedXidsRemovePreceding(TransactionId removeXid)
 		pArray->tailKnownAssignedXids = i;
 	}
 
-	/* Opportunistically compress the array */
-	KnownAssignedXidsCompress(false);
+	KnownAssignedXidsCompress(true);
 }
 
 /*
diff --git a/src/include/storage/standby.h b/src/include/storage/standby.h
index f5da98dc73..01a0d5dd9e 100644
--- a/src/include/storage/standby.h
+++ b/src/include/storage/standby.h
@@ -45,6 +45,7 @@ extern void StandbyLockTimeoutHandler(void);
 extern void LogRecoveryConflict(ProcSignalReason reason, TimestampTz wait_start,
 								TimestampTz now, VirtualTransactionId *wait_list,
 								bool still_waiting);
+extern void StartupProcessIdleMaintenance(void);
 
 /*
  * Standby Rmgr (RM_STANDBY_ID)
