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.
34.1. Overview #
Regular INSERT operations are sufficient for populating tables in most scenarios. However, when you need to insert huge volumes of data into your database, Postgres Pro offers more efficient solutions.
At high ingestion rates, regular INSERT operations into the same table can suffer from higher latency even though they do not fully utilize CPU and disk resources. Increasing the number of backend processes does not scale the performance linearly and may even further increase the latency.
Data insertion performance can be constrained by the following factors:
page-level locks
a high rate of WAL writes
contention for shared structures, such as the free space map (FSM)
Postgres Pro provides two features for bulk data insertion that are designed for different scenarios:
Append-optimized tables (AOTs) are designed for high-volume continuous flow of data, such as logs or metrics.
Multi-segment insertion is designed for one-off bulk data insertion into the same table in multiple threads simultaneously, e.g. data migration or restoration from backups.
Warning
Multi-segment insertion is currently experimental and is not recommended for using in production.
The table below describes the advantages of both bulk insertion methods.
Table 34.1. Comparison of bulk insertion solutions
| Features | Append-Optimized Tables | Multi-Segment Insertion |
|---|---|---|
Table locks during | Not locked | Locked |
Supported DML operations | All DML operations are processed, only | Only |
| WAL load optimization | INSERT operations generate fewer WAL records and result in lower WAL contention | Multi-segment insertion generates a single WAL record per page (full-page write) |
| Memory requirements | AOT buffer size depends on the size of inserted rows and requires up to 8 MB of work_mem memory for each table | Data is written in 32-page blocks, which requires 256 KB of work_mem memory per segment |
| Optimization method | Buffering incoming | Multiple processes can insert data into their own segments without blocking each other |
You can use multi-segment insertion with append-optimized tables. For more information, refer to Section 34.4.