aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2022-04-07 14:34:37 +0900
committerMichael Paquier <michael@paquier.xyz>2022-04-07 14:34:37 +0900
commit06f5295af673df795e8e70e28c43d61c2817b6df (patch)
tree12890d4f2fd35f2ff632474406439b014c8c5c3f /src/backend/access/transam
parentfbfe6910eca0d6a61cbcdd27cdd5a8d9de6477fa (diff)
downloadpostgresql-06f5295af673df795e8e70e28c43d61c2817b6df.tar.gz
postgresql-06f5295af673df795e8e70e28c43d61c2817b6df.zip
Add single-item cache when looking at topmost XID of a subtrans XID
This change affects SubTransGetTopmostTransaction(), used to find the topmost transaction ID of a given transaction ID. The cache is able to store one value, so as we can save the backend from unnecessary lookups at pg_subtrans/ on repetitive calls of this routine. There is a similar practice in transam.c, for example. Author: Simon Riggs Reviewed-by: Andrey Borodin, Julien Rouhaud Discussion: https://postgr.es/m/CANbhV-G8Co=yq4v4BkW7MJDqVt68K_8A48nAZ_+8UQS7LrwLEQ@mail.gmail.com
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r--src/backend/access/transam/subtrans.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c
index 66d35481552..7240454ca4e 100644
--- a/src/backend/access/transam/subtrans.c
+++ b/src/backend/access/transam/subtrans.c
@@ -54,6 +54,14 @@
#define TransactionIdToPage(xid) ((xid) / (TransactionId) SUBTRANS_XACTS_PER_PAGE)
#define TransactionIdToEntry(xid) ((xid) % (TransactionId) SUBTRANS_XACTS_PER_PAGE)
+/*
+ * Single-item cache for results of SubTransGetTopmostTransaction(). It's
+ * worth having such a cache because we frequently find ourselves repeatedly
+ * checking the same XID, for example when scanning a table just after a
+ * bulk insert, update, or delete.
+ */
+static TransactionId cachedFetchSubXid = InvalidTransactionId;
+static TransactionId cachedFetchTopmostXid = InvalidTransactionId;
/*
* Link to shared-memory data structures for SUBTRANS control
@@ -155,6 +163,13 @@ SubTransGetTopmostTransaction(TransactionId xid)
/* Can't ask about stuff that might not be around anymore */
Assert(TransactionIdFollowsOrEquals(xid, TransactionXmin));
+ /*
+ * Before going to the subtrans log, check our single item cache to see if
+ * we know the result from a previous/recent request.
+ */
+ if (TransactionIdEquals(xid, cachedFetchSubXid))
+ return cachedFetchTopmostXid;
+
while (TransactionIdIsValid(parentXid))
{
previousXid = parentXid;
@@ -174,6 +189,9 @@ SubTransGetTopmostTransaction(TransactionId xid)
Assert(TransactionIdIsValid(previousXid));
+ cachedFetchSubXid = xid;
+ cachedFetchTopmostXid = previousXid;
+
return previousXid;
}