34.1. Обзор #

Обычных операций INSERT достаточно для заполнения таблиц в большинстве сценариев. Однако, когда вам нужно вставить большие объёмы данных в базу данных, Postgres Pro предлагает более эффективные решения.

При высоких скоростях загрузки в одну и ту же таблицу обычные операции INSERT могут страдать от повышенных задержек, даже если они не задействуют полностью ресурсы процессора и диска. Увеличение числа обслуживающих процессов не приводит к линейному росту производительности и может даже ещё сильнее увеличить задержки.

Скорость вставки данных ограничивается следующими факторами:

  • блокировки на уровне страниц;

  • высокая нагрузка по записи в WAL;

  • конкуренция за доступ к общим структурам, таким как карта свободного пространства (FSM, free space map).

Postgres Pro предоставляет следующие возможности для массовой вставки данных, предназначенные для разных сценариев:

  • Таблицы с оптимизацией для добавления данных (append-optimized tables, AOTs) предназначены для непрерывного потока данных большого объёма, такого как журналирование или метрики.

  • Многосегментная вставка предназначена для разовой массовой вставки данных в одну таблицу несколькими параллельными потоками, например, при миграции данных или восстановлении данных из резервной копии.

    Предупреждение

    В настоящее время многосегментная вставка является экспериментальной функциональностью и не рекомендована для использования в производственной среде.

В таблице ниже описаны преимущества обоих методов массовой вставки данных.

Таблица 34.1. Сравнение решений по массовой вставке данных

Функциональные возможностиТаблицы с оптимизацией для добавления данныхМногосегментная вставка

Блокировка таблицы на время операций INSERT

Не блокируется

Блокируется

Поддерживаемые DML-операции

Обрабатываются все операции DML, оптимизируются только операции INSERT

Обрабатываются только операции INSERT, операции UPDATE и DELETE могут приводить к непредвиденным результатам

Оптимизация нагрузки WALОперации INSERT создают меньше записей WAL и приводят к меньшей конкуренции за WAL

Многосегментная вставка создаёт одну запись WAL на страницу (запись содержит полную страницу)

Требования к памяти

Размер буфера AOT зависит от размера вставляемых строк и требует до 8 МБ памяти work_mem для каждой таблицы

Данные пишутся 32-страничными блоками, что требует 256 КБ памяти work_mem на каждый сегмент

Метод оптимизации

Буферизация входящих операций INSERT

Несколько процессов могут вставлять данные в собственные сегменты, не блокируя друг друга


Многосегментную вставку можно использовать для таблиц с оптимизацией для добавления данных. За подробной информацией обратитесь к Раздел 34.4.

FAQ