From: | "houzj(dot)fnst(at)fujitsu(dot)com" <houzj(dot)fnst(at)fujitsu(dot)com> |
---|---|
To: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Delay the variable initialization in get_rel_sync_entry |
Date: | 2021-12-22 13:11:38 |
Message-ID: | OS0PR01MB5716E863AA9E591C1F010F7A947D9@OS0PR01MB5716.jpnprd01.prod.outlook.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
When reviewing some logical replication patches. I noticed that in
function get_rel_sync_entry() we always invoke get_rel_relispartition()
and get_rel_relkind() at the beginning which could cause unnecessary
cache access.
---
get_rel_sync_entry(PGOutputData *data, Oid relid)
{
RelationSyncEntry *entry;
bool am_partition = get_rel_relispartition(relid);
char relkind = get_rel_relkind(relid);
---
The extra cost could sometimes be noticeable because get_rel_sync_entry is a
hot function which is executed for each change. And the 'am_partition' and
'relkind' are necessary only when we need to rebuild the RelationSyncEntry.
Here is the perf result for the case when inserted large amounts of data into a
un-published table in which case the cost is noticeable.
--12.83%--pgoutput_change
|--11.84%--get_rel_sync_entry
|--4.76%--get_rel_relispartition
|--4.70%--get_rel_relkind
So, I think it would be better if we do the initialization only when
RelationSyncEntry in invalid.
Attach a small patch which delay the initialization.
Thoughts ?
Best regards,
Hou zj
Attachment | Content-Type | Size |
---|---|---|
0001-Delay-the-variable-initialization-in-get_rel_sync_en.patch | application/octet-stream | 1.3 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Andrey Lepikhov | 2021-12-22 13:17:35 | Re: Clarifying/rationalizing Vars' varno/varattno/varnoold/varoattno |
Previous Message | Amit Kapila | 2021-12-22 12:52:01 | Re: parallel vacuum comments |