]> granicus.if.org Git - postgresql/commit
tableam: Add table_multi_insert() and revamp/speed-up COPY FROM buffering.
authorAndres Freund <andres@anarazel.de>
Thu, 4 Apr 2019 22:47:19 +0000 (15:47 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 4 Apr 2019 23:28:18 +0000 (16:28 -0700)
commit86b85044e823a304d2a265abc030254d39efe7df
tree7a4e236f6a73a38db638c561a238f1d29d0f436b
parent7bac3acab4d5c3f2c35aa3a7bea08411d83fd5bc
tableam: Add table_multi_insert() and revamp/speed-up COPY FROM buffering.

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
src/backend/access/heap/heapam.c
src/backend/access/heap/heapam_handler.c
src/backend/commands/copy.c
src/backend/executor/execMain.c
src/backend/executor/execPartition.c
src/include/access/heapam.h
src/include/access/tableam.h
src/include/nodes/execnodes.h
src/tools/pgindent/typedefs.list