У меня есть две таблицы базы данных. Один содержит сотни миллионов записей. Позвоните этому history
. Другой рассчитывается ежедневно, и я хочу скопировать все его записи в history
один.
Что я сделал, чтобы бежать:
INSERT INTO history SELECT * FROM daily
И некоторое время это делало свое дело, но оно становилось все медленнее и медленнее, так как количество записей продолжало расти. Теперь у меня есть около 2 миллионов записей , которые должны быть скопированы с daily
к history
в одной операции , и это занимает слишком много времени , чтобы закончить.
Есть ли другой, более эффективный способ копирования данных из одной таблицы в другую?
источник
Дамп таблицы в формате CSV
используйте команду COPY, которая гораздо более эффективна для больших объемов данных.
Проверьте postgres docs на http://www.postgresql.org/docs/current/static/sql-copy.html для получения дополнительной информации.
источник
history
таблице 160 миллионов строк , и мы добавляем еще 3 миллиона строк.Проблема была с индексами.
history
Таблица была 160M индексированных строк. Запустив или,COPY FROM
илиINSERT INTO .. SELECT
потребовалось много времени не для вставки строк, а для обновления индексов. Когда я отключил индексы, он импортировал 3M строк за 10 секунд. Теперь мне нужно найти более быстрый способ переиндексации большого стола.источник
Вы можете использовать инструмент PSQL , я мог бы быть эффективным, как показано ниже,
Также вы можете написать сценарий оболочки.
источник
Это, конечно, не точный ответ на ваш вопрос, но если вам не нужен доступ к
history
таблице, вы также можете сгенерировать дамп SQL:Затем можно использовать такой инструмент, как
git
рассчитать разницу и эффективно ее сохранить.Это полезно, потому что большинство частей в базе данных не будут меняться каждый день. Вместо того, чтобы хранить полную копию для каждого дня, можно хранить разницу между двумя днями.
Вы можете использовать
crontab
работу так, чтобы дамп обрабатывался каждый день.источник