34.1. Обзор #
Обычных операций INSERT достаточно для заполнения таблиц в большинстве сценариев. Однако, когда вам нужно вставить большие объёмы данных в базу данных, Postgres Pro предлагает более эффективные решения.
При высоких скоростях загрузки в одну и ту же таблицу обычные операции INSERT могут страдать от повышенных задержек, даже если они не задействуют полностью ресурсы процессора и диска. Увеличение числа обслуживающих процессов не приводит к линейному росту производительности и может даже ещё сильнее увеличить задержки.
Скорость вставки данных ограничивается следующими факторами:
блокировки на уровне страниц;
высокая нагрузка по записи в WAL;
конкуренция за доступ к общим структурам, таким как карта свободного пространства (FSM, free space map).
Postgres Pro предоставляет следующие возможности для массовой вставки данных, предназначенные для разных сценариев:
Таблицы с оптимизацией для добавления данных (append-optimized tables, AOTs) предназначены для непрерывного потока данных большого объёма, такого как журналирование или метрики.
Многосегментная вставка предназначена для разовой массовой вставки данных в одну таблицу несколькими параллельными потоками, например, при миграции данных или восстановлении данных из резервной копии.
Предупреждение
В настоящее время многосегментная вставка является экспериментальной функциональностью и не рекомендована для использования в производственной среде.
В таблице ниже описаны преимущества обоих методов массовой вставки данных.
Таблица 34.1. Сравнение решений по массовой вставке данных
| Функциональные возможности | Таблицы с оптимизацией для добавления данных | Многосегментная вставка |
|---|---|---|
Блокировка таблицы на время операций | Не блокируется | Блокируется |
Поддерживаемые DML-операции | Обрабатываются все операции DML, оптимизируются только операции | Обрабатываются только операции |
| Оптимизация нагрузки WAL | Операции INSERT создают меньше записей WAL и приводят к меньшей конкуренции за WAL | Многосегментная вставка создаёт одну запись WAL на страницу (запись содержит полную страницу) |
| Требования к памяти | Размер буфера AOT зависит от размера вставляемых строк и требует до 8 МБ памяти work_mem для каждой таблицы | Данные пишутся 32-страничными блоками, что требует 256 КБ памяти work_mem на каждый сегмент |
| Метод оптимизации | Буферизация входящих операций | Несколько процессов могут вставлять данные в собственные сегменты, не блокируя друг друга |
Многосегментную вставку можно использовать для таблиц с оптимизацией для добавления данных. За подробной информацией обратитесь к Раздел 34.4.