• Andres Freund's avatar
    tableam: Add table_multi_insert() and revamp/speed-up COPY FROM buffering. · 86b85044
    Andres Freund authored
    This adds table_multi_insert(), and converts COPY FROM, the only user
    of heap_multi_insert, to it.
    
    A simple conversion of COPY FROM use slots would have yielded a
    slowdown when inserting into a partitioned table for some
    workloads. Different partitions might need different slots (both slot
    types and their descriptors), and dropping / creating slots when
    there's constant partition changes is measurable.
    
    Thus instead revamp the COPY FROM buffering for partitioned tables to
    allow to buffer inserts into multiple tables, flushing only when
    limits are reached across all partition buffers. By only dropping
    slots when there've been inserts into too many different partitions,
    the aforementioned overhead is gone. By allowing larger batches, even
    when there are frequent partition changes, we actuall speed such cases
    up significantly.
    
    By using slots COPY of very narrow rows into unlogged / temporary
    might slow down very slightly (due to the indirect function calls).
    
    Author: David Rowley, Andres Freund, Haribabu Kommi
    Discussion:
        https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
        https://postgr.es/m/20190327054923.t3epfuewxfqdt22e@alap3.anarazel.de
    86b85044
tableam.h 56.4 KB