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