В зависимости от того, сколько существует различных наборов данных, одним из вариантов будет разделение таблиц по наборам данных.
При обновлении набора данных, BEGINновой транзакции, TRUNCATEтаблицы, COPYновых данных в нем и COMMIT. PostgreSQL имеет оптимизацию где COPYать в таблицу , которая была TRUNCATEd в той же транзакции делает гораздо меньше I / O , если вы используете wal_level = minimal(по умолчанию).
Если вы не можете разделить и усечь (скажем, если вы имеете дело с десятками или сотнями тысяч наборов данных, где было бы слишком много таблиц), вы вместо этого захотите запустить автоочистку, чтобы запустить как можно больше. Убедитесь, что у вас есть хорошие индексы для всего, что вы удаляете на основе, и будьте готовы к несколько обычной производительности.
Если вам не нужна защита от сбоев - вы не против того, чтобы ваши таблицы оставались пустыми после сбоя системы - вы также можете создать свои таблицы как UNLOGGED, что сэкономит вам огромное количество затрат на ввод-вывод.
Если вы не возражаете против восстановления всей установки из резервной копии после сбоя системы, вы можете пойти еще дальше и также установить fsync=off, что в основном говорит PostgreSQL: «Не беспокойтесь о безопасности при сбое, у меня есть хорошие резервные копии, и я не Мне все равно, будут ли мои данные окончательно и полностью невосстановимыми после сбоя, и я рад повторно, initdbпрежде чем смогу снова использовать свою базу данных ".
Я написал еще об этом в аналогичной теме о переполнении стека об оптимизации PostgreSQL для быстрого тестирования ; в котором упоминается настройка ОС хоста, разделение WAL на другой диск, если вы не используете unloggedтаблицы, настройки контрольных точек и т. д.
В документации Pg также есть некоторая информация для быстрой загрузки данных и недолговременных настроек .