diff options
author | Michael Paquier <michael@paquier.xyz> | 2022-04-07 14:34:37 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2022-04-07 14:34:37 +0900 |
commit | 06f5295af673df795e8e70e28c43d61c2817b6df (patch) | |
tree | 12890d4f2fd35f2ff632474406439b014c8c5c3f /src/backend/access/transam | |
parent | fbfe6910eca0d6a61cbcdd27cdd5a8d9de6477fa (diff) | |
download | postgresql-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.c | 18 |
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; } |