Reduce relcache access in WAL sender streaming logical changes
authorMichael Paquier
Wed, 5 Jan 2022 01:27:47 +0000 (10:27 +0900)
committerMichael Paquier
Wed, 5 Jan 2022 01:27:47 +0000 (10:27 +0900)
get_rel_sync_entry(), which is called each time a change needs to be
logically replicated, is a rather hot code path in the WAL sender
sending logical changes.  This code path was doing a relcache access on
relkind and relpartition for each logical change, but we only need to
know this information when building or re-building the cached
information for a relation.

Some measurements prove that this is noticeable in perf profiles,
particularly when attempting to replicate changes from relations that
are not published as these cause less overhead in the WAL sender,
delaying further the replication of changes for relations that are
published.

Issue introduced in 83fd453.

Author: Hou Zhijie
Reviewed-by: Kyotaro Horiguchi, Euler Taveira
Discussion: https://postgr.es/m/OS0PR01MB5716E863AA9E591C1F010F7A947D9@OS0PR01MB5716.jpnprd01.prod.outlook.com
Backpatch-through: 13

src/backend/replication/pgoutput/pgoutput.c

index abd5217ab1b5ee8e23eff86025f33aca41e63e9d..d29e1c5e9b2b996ada5c5ccc7b7d0fbe9d1fcce1 100644 (file)
@@ -1008,8 +1008,6 @@ static RelationSyncEntry *
 get_rel_sync_entry(PGOutputData *data, Oid relid)
 {
    RelationSyncEntry *entry;
-   bool        am_partition = get_rel_relispartition(relid);
-   char        relkind = get_rel_relkind(relid);
    bool        found;
    MemoryContext oldctx;
 
@@ -1041,6 +1039,8 @@ get_rel_sync_entry(PGOutputData *data, Oid relid)
        List       *pubids = GetRelationPublications(relid);
        ListCell   *lc;
        Oid         publish_as_relid = relid;
+       bool        am_partition = get_rel_relispartition(relid);
+       char        relkind = get_rel_relkind(relid);
 
        /* Reload publications if needed before use. */
        if (!publications_valid)