diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index cced823..f54b01b 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -1724,6 +1724,8 @@ GetSnapshotData(Snapshot snapshot) snapshot->curcid = GetCurrentCommandId(false); + snapshot->cachedSearchXid = InvalidTransactionId; + /* * This is a new snapshot, so set both refcounts are zero, and mark it as * not copied in persistent memory. diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c index de7b3fc..8f78732 100644 --- a/src/backend/utils/time/tqual.c +++ b/src/backend/utils/time/tqual.c @@ -1467,6 +1467,12 @@ XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) return true; /* + * Fastpath out if this snapshot has checked this xid recently. + */ + if (TransactionIdEquals(xid, snapshot->cachedSearchXid)) + return true; + + /* * Snapshot information is stored slightly differently in snapshots taken * during recovery. */ @@ -1487,7 +1493,10 @@ XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) for (j = 0; j < snapshot->subxcnt; j++) { if (TransactionIdEquals(xid, snapshot->subxip[j])) + { + snapshot->cachedSearchXid = xid; return true; + } } /* not there, fall through to search xip[] */ @@ -1509,7 +1518,10 @@ XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) for (i = 0; i < snapshot->xcnt; i++) { if (TransactionIdEquals(xid, snapshot->xip[i])) + { + snapshot->cachedSearchXid = xid; return true; + } } } else @@ -1545,7 +1557,10 @@ XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) for (j = 0; j < snapshot->subxcnt; j++) { if (TransactionIdEquals(xid, snapshot->subxip[j])) + { + snapshot->cachedSearchXid = xid; return true; + } } } diff --git a/src/include/utils/snapshot.h b/src/include/utils/snapshot.h index cbf1bbd..e14128a 100644 --- a/src/include/utils/snapshot.h +++ b/src/include/utils/snapshot.h @@ -94,6 +94,13 @@ typedef struct SnapshotData CommandId curcid; /* in my xact, CID < curcid are visible */ /* + * Cache information, for use in speeding up repeated calls to check + * XidInMVCCSnapshot(). All snapshots start with InvalidTransactionid. + * Name and design similar to cachedFetchXid within transam.c + */ + TransactionId cachedSearchXid; + + /* * An extra return value for HeapTupleSatisfiesDirty, not used in MVCC * snapshots. */