diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index faa46742bf..984ab7258a 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -2679,13 +2679,10 @@ CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode)
 	{
 		int			pgprocno = arrayP->pgprocnos[index];
 		PGPROC	   *proc = &allProcs[pgprocno];
-		VirtualTransactionId procvxid;
 
-		GET_VXID_FROM_PGPROC(procvxid, *proc);
-
-		if (procvxid.backendId == vxid.backendId)
+		if (vxid.backendId == proc->backendId)
 		{
-			if (procvxid.localTransactionId == vxid.localTransactionId)
+			if (vxid.localTransactionId == proc->lxid)
 			{
 				proc->recoveryConflictPending = true;
 				pid = proc->pid;
@@ -2695,9 +2692,14 @@ CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode)
 					 * Kill the pid if it's still here. If not, that's what we
 					 * wanted so ignore any errors.
 					 */
-					(void) SendProcSignal(pid, sigmode, vxid.backendId);
+					(void) SendProcSignal(pid, sigmode, proc->backendId);
 				}
 			}
+
+			/*
+			 * As soon as we find the right proc entry, we don't need to check
+			 * the remaining ones.
+			 */
 			break;
 		}
 	}
