Thread

  1. Re: postgres_fdw: Use COPY to speed up batch inserts

    Jakub Wartak <jakub.wartak@enterprisedb.com> — 2025-10-17T09:28:44Z

    On Thu, Oct 16, 2025 at 10:42 PM Tomas Vondra <tomas@vondra.me> wrote:
    > Thanks for the patch. Please add it to the next committfest (PG19-3) at
    
    Hi Matheus! same here - thanks for the patch!
    
    > > The attached patch uses the COPY command whenever we have a *numSlots >
    > > 1 but the tests show that maybe we should have a GUC to enable this?
    > >
    >
    > I can imagine having a GUC for testing, but it's not strictly necessary.
    
    Just note, I've played maybe like 20mins with this patch and it works,
    however if we would like to have yet another GUCs then we would need
    to enable two of those? (enable batch_size and this hypothetical
    `batch_use_copy`?)
    
    Some other stuff I've tried to cover:
    1. how this works with INSERT RETURNING -> as per patch it fallbacks
    from COPY to INSERT as expected
    2. how this works with INSERT ON CONFLICT -> well, we cannot have
    constraints on postgres_fdw, so it is impossible
    3. how this works with MERGE -> well, MERGE doesnt work with postgres_fdw
    4. I've found that big rows don't play with COPY feature without
    memory limitation, so probably some special handling should be done
    here, it's nonsense , but:
    
        postgres@postgres:1236 : 15836 # INSERT INTO local_t1 (id, t)
    SELECT s, repeat(md5(s::text), 10000000) from generate_series(100,
    103) s;
        2025-10-17 11:17:08.742 CEST [15836] LOG:  statement: INSERT INTO
    local_t1 (id, t) SELECT s, repeat(md5(s::text), 10000000) from
    generate_series(100, 103) s;
        2025-10-17 11:17:08.743 CEST [15838] LOG:  statement: START
    TRANSACTION ISOLATION LEVEL REPEATABLE READ
        2025-10-17 11:17:38.302 CEST [15838] LOG:  statement: COPY
    public.t1(id, t, counter) FROM STDIN (FORMAT TEXT, DELIMITER ',')
        ERROR:  string buffer exceeds maximum allowed length (1073741823 bytes)
        DETAIL:  Cannot enlarge string buffer containing 960000028 bytes
    by 320000000 more bytes.
        2025-10-17 11:17:40.213 CEST [15836] ERROR:  string buffer exceeds
    maximum allowed length (1073741823 bytes)
        2025-10-17 11:17:40.213 CEST [15836] DETAIL:  Cannot enlarge
    string buffer containing 960000028 bytes by 320000000 more bytes.
        2025-10-17 11:17:40.213 CEST [15836] STATEMENT:  INSERT INTO
    local_t1 (id, t) SELECT s, repeat(md5(s::text), 10000000) from
    generate_series(100, 103) s;
    
        but then it never wants to finish that backend (constant loop[ in
    PQCleanup() or somewhere close to that), server behaves unstable.
        Without batch_size set the very same INSERT behaves OK.
    
    Regards,
    -J.