2016-07-06 2 views
1

У нас есть файл 150M линий, обновляет только одну таблицу базы данных PostgreSQL с такими командами:Какой самый быстрый способ применить обновления 150M на PostgreSQL таблице

UPDATE "events" SET "value_1" = XX, "value_2" = XX, "value_3" = XX, "value_4" = XX WHERE "events"."id" = SOME_ID; 

Все идентификаторы уникальны, нет никакого способа примените это обновление к нескольким событиям. В настоящее время такое обновление занимает около нескольких дней, если мы запускаем его с помощью \i update.sql в psql.

Есть ли более быстрый способ запустить его?

+1

Вы пытаетесь запустить, что с автоматической фиксации _disabled_ в одной транзакции? –

+0

Как это повлияет на БД, поскольку в этой таблице несколько сотен операционных систем в секунду, можем ли мы испортить данные или заблокировать таблицу для всего обновления? – nateless

+0

У вас есть указатель на «события». «Id»? – Jayadevan

ответ

3
  • Простейшее: добавить set synchronous_commit=off до того \i update.sql

  • Лучше:

    • Разделить файл на части как 100000 обновления:
      split -l 100000 -a 6 --additional-suffix=.sql update.sql update-part
    • Запуск этих обновлений параллельно, каждый файл в одной транзакции, например, с:
      /bin/ls update-part*.sql \ | xargs --max-procs=8 --replace psql --single-transaction --file={}
Смежные вопросы