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