Postgres оптимизировать ОБНОВЛЕНИЕ - PullRequest
1 голос
/ 08 июля 2011

Мне нужно сделать сложный импорт данных. Мне нужно сделать несколько ОБНОВЛЕНИЙ, которые в настоящее время обновляют более 3 миллионов строк в одном запросе. Этот запрос применяется около 30-45 секунд каждый (некоторые из них даже 4-5 минут). Мой вопрос, могу ли я ускорить это. Где я могу прочитать об этом, какие индексы и какие столбцы я могу установить для улучшения этих обновлений. Мне не нужен точный ответ, поэтому я не показываю таблицы. Я ищу кое-что, чтобы узнать об этом.

Ответы [ 2 ]

6 голосов
/ 08 июля 2011

Две вещи:

1) Отправьте EXPLAIN ANALYZE вашего UPDATE запроса.

2) Если ваш UPDATE не должен быть атомарным, тогда вы можете захотетьрассмотреть возможность разделения числа строк, затронутых вашим UPDATE.Чтобы свести к минимуму количество «потерянных строк» ​​из-за превышения Карты свободного пространства , рассмотрите следующий подход:

  1. BEGIN
  2. UPDATE ... LIMIT N; илинекоторые предикаты, ограничивающие количество строк (например, WHERE username ilike 'a%';).
  3. COMMIT
  4. VACUUM table_being_updated
  5. Повторяйте шаги 1-4, пока все строки не будут обновлены.
  6. ANALYZE table_being_updated

Я подозреваю, что вы обновляете каждую строку в вашей таблице и вам не нужно, чтобы все строки отображались с новым значением в конце одноготранзакция, поэтому вышеупомянутый подход разбиения UPDATE на более мелкие транзакции будет хорошим подходом.

И да, INDEX в соответствующих столбцах, указанных в предикате UPDATE, будетпомощь значительно поможет.Опять же, отправьте EXPLAIN ANALYZE, если вам нужна дополнительная помощь.

0 голосов
/ 08 июля 2011

Если под число ОБНОВЛЕНИЙ вы подразумеваете одну команду ОБНОВЛЕНИЕ для каждой обновленной строки, то проблема заключается в том, что все индексы целевой таблицы будут обновлены, и все ограничения будут проверены прикаждая обновленная строка.Если это так, то попробуйте вместо этого обновить все строки одним UPDATE:

update t
set a = t2.b 
from t2
where t.id = t2.id

Если импортированные данные находятся в текстовом файле, сначала вставьте их во временную таблицу и обновите оттуда.Смотрите мой ответ здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...