diff options
author | Alexander Korotkov | 2024-07-03 23:05:37 +0000 |
---|---|---|
committer | Alexander Korotkov | 2024-07-03 23:05:37 +0000 |
commit | 6897f0ec024582a570868939d3f34a6853374723 (patch) | |
tree | 8c9d63f70635cc43061f7b3e4ab8dcad9ee48ec2 | |
parent | 6c1af5482e6943a5f29b7f4ca773c720ec8202b0 (diff) |
Optimize memory access in GetRunningTransactionData()
e85662df44 made GetRunningTransactionData() calculate the oldest running
transaction id within the current database. This commit optimized this
calculation by performing a cheap transaction id comparison before fetching
the process database id, while the latter could cause extra cache misses.
Reported-by: Noah Misch
Discussion: https://postgr.es/m/20240630231816.bf.nmisch%40google.com
-rw-r--r-- | src/backend/storage/ipc/procarray.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 9fc930e98f8..16b5803d388 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -2753,8 +2753,6 @@ GetRunningTransactionData(void) */ for (index = 0; index < arrayP->numProcs; index++) { - int pgprocno = arrayP->pgprocnos[index]; - PGPROC *proc = &allProcs[pgprocno]; TransactionId xid; /* Fetch xid just once - see GetNewTransactionId */ @@ -2776,11 +2774,18 @@ GetRunningTransactionData(void) oldestRunningXid = xid; /* - * Also, update the oldest running xid within the current database. + * Also, update the oldest running xid within the current database. As + * fetching pgprocno and PGPROC could cause cache misses, we do cheap + * TransactionId comparison first. */ - if (proc->databaseId == MyDatabaseId && - TransactionIdPrecedes(xid, oldestDatabaseRunningXid)) - oldestDatabaseRunningXid = xid; + if (TransactionIdPrecedes(xid, oldestDatabaseRunningXid)) + { + int pgprocno = arrayP->pgprocnos[index]; + PGPROC *proc = &allProcs[pgprocno]; + + if (proc->databaseId == MyDatabaseId) + oldestDatabaseRunningXid = xid; + } if (ProcGlobal->subxidStates[index].overflowed) suboverflowed = true; |