| From: | "Matheus Alcantara" <matheusssilv97(at)gmail(dot)com> |
|---|---|
| To: | "jian he" <jian(dot)universality(at)gmail(dot)com>, "Matheus Alcantara" <matheusssilv97(at)gmail(dot)com> |
| Cc: | "Tomas Vondra" <tomas(at)vondra(dot)me>, <pgsql-hackers(at)postgresql(dot)org> |
| Subject: | Re: postgres_fdw: Use COPY to speed up batch inserts |
| Date: | 2025-10-30 00:28:41 |
| Message-ID: | DDV8CK8EJQQ0.DWQGFW2NOCGU@gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Wed Oct 29, 2025 at 12:10 AM -03, jian he wrote:
> On Sat, Oct 25, 2025 at 2:27 AM Matheus Alcantara
> <matheusssilv97(at)gmail(dot)com> wrote:
>>
>> On this new version I also added some regress tests on postgres_fdw.sql
>>
>
> In the CopyFrom function, we have the CopyInsertMethod, CIM_SINGLE is slower
> than CIM_MULTI, I think.
> We should do performance tests for the case where the COPY statement is limited
> to use CIM_SINGLE.
>
> You can use triggers to make COPY can only use the CIM_SINGLE copymethod.
> for example:
> create function dummy() returns trigger as $$ begin return new; end $$
> language plpgsql;
> create trigger dummy
> before insert or update on batch_table_3
> for each row execute procedure dummy();
>
> My local tests show that when batch_size is greater than 2, COPY performs faster
> than batch inserts into a foreign table, even though COPY can only use
> CIM_SINGLE.
> However, my tests were done with an enable-assert build, since I
> encountered issues compiling the release build.
>
> anyway, I am sharing my test script.
>
I've benchmarked using buildtype=release with Dcassert=false and
buildtype=debug with Dcassert=true and in both cases I've got a worst
performance when using the COPY for batching insert into a a foreign
table with a trigger. See the results (best of 4 runs).
Batch using INSERT
batch_size: 100
buildtype=debug
Dcassert=true
tps = 13.596754
Batch using COPY
batch_size: 100
buildtype=debug
Dcassert=true
tps = 11.650642
--------------------
Batch using INSERT
batch_size: 100
buildtype=release
Dcassert=false
tps = 28.333161
Batch using COPY
batch_size: 100
buildtype=release
Dcassert=false
tps = 18.499420
It seems to me that we need to disable the COPY usage when the foreign
table has triggers enabled.
--
Matheus Alcantara
| From | Date | Subject | |
|---|---|---|---|
| Next Message | David Rowley | 2025-10-30 00:49:19 | Re: Use BumpContext contexts for TupleHashTables' tablecxt |
| Previous Message | Michael Paquier | 2025-10-30 00:26:27 | Re: Question about InvalidatePossiblyObsoleteSlot() |