18.13. Многосегментная вставка #
Предупреждение
В настоящее время многосегментная вставка является экспериментальной функциональностью и не рекомендована для использования в производственной среде. Она имеет следующие ограничения:
Триггеры
AFTER INSERTмогут не сработать, если обращаются к только что вставленным строкам. Причина заключается в том, что в режиме многосегментной вставки данные временно находятся во внутреннем буфере и недоступны для немедленного чтения.Многосегментная вставка поддерживает триггеры, которые не читают вставленные данные, например отправку уведомлений, запись в журнал аудита и т.д.
Многосегментная вставка не поддерживает триггеры, которые читают или изменяют только что вставленные данные.
При параллельной вставке данных несколькими потоками ограничения уникальности в Postgres Pro не контролируются и могут быть нарушены.
Многосегментная вставка подходит для использования в следующих случаях:
Восстановление данных из pg_dump
Загрузка данных из согласованной резервной копии
В остальных случаях ограничения уникальности данных должны обеспечиваться сторонними средствами.
Postgres Pro Enterprise позволяет осуществлять массовую вставку данных в одну таблицу несколькими параллельными потоками без использования менеджера буферов Postgres Pro. Эта функциональность предназначена в первую очередь для миграции данных и восстановления из резервных копий.
Postgres Pro Enterprise не требует особой подготовки или настройки для многосегментной вставки при подключении нового клиента. Любой клиентский обслуживающий процесс может осуществлять вставку в многосегментном режиме.
Перед записью данных в таблицу следует указать имя таблицы в параметре multi-segment-relname. Поскольку этот параметр можно устанавливать несколько раз в течение одного сеанса, один обслуживающий процесс может выполнять многосегментную вставку в несколько таблиц, переключаясь между их выделенными сегментами.
Чтобы предотвратить конфликты блокировок, каждый обслуживающий процесс создаёт выделенный сегмент таблицы для вставки данных. Обслуживающие процессы, которые не выполняют многосегментную вставку, не имеют доступа к этому сегменту и его таблице — даже на чтение. Обслуживающие процессы, использующие многосегментную вставку, могут читать данные из выделенных сегментов других обслуживающих процессов, но записывать данные могут только в свои собственные сегменты. Когда сегмент заполнен, обслуживающий процесс немедленно создаёт новый сегмент и продолжает запись в него.
Перед выполнением первой операции INSERT обслуживающий процесс запрашивает исключительную блокировку на уровне сеанса на таблицу, указанную в параметре multi-segment-relname. Эта блокировка запрещает доступ к таблице всем процессам, включая autovacuum, кроме тех, что выполняют многосегментную вставку в эту таблицу. Все операции, кроме многосегментной вставки, становятся недоступны.
Важно
Блокировка с таблицы снимается, когда все обслуживающие процессы, выполнявшие многосегментную вставку в эту таблицу, отключаются от базы данных.
Страницы данных, вставленные с использованием многосегментного механизма, функционируют как обычные страницы данных Postgres Pro: они записываются на диск во время выполнения команды COMMIT или CHECKPOINT для большей безопасности.
Важно
Многосегментную вставку рекомендуется использовать только для операций INSERT. Её использование совместно с операциями UPDATE и DELETE может приводить к непредвиденным результатам.
Многосегментную вставку нельзя использовать со следующими отношениями:
отношения системного каталога;
отношения TOAST;
временные отношения.