Две вещи:
1) Отправьте EXPLAIN ANALYZE
вашего UPDATE
запроса.
2) Если ваш UPDATE
не должен быть атомарным, тогда вы можете захотетьрассмотреть возможность разделения числа строк, затронутых вашим UPDATE
.Чтобы свести к минимуму количество «потерянных строк» из-за превышения Карты свободного пространства , рассмотрите следующий подход:
BEGIN
UPDATE ... LIMIT N;
илинекоторые предикаты, ограничивающие количество строк (например, WHERE username ilike 'a%';
). COMMIT
VACUUM table_being_updated
- Повторяйте шаги 1-4, пока все строки не будут обновлены.
ANALYZE table_being_updated
Я подозреваю, что вы обновляете каждую строку в вашей таблице и вам не нужно, чтобы все строки отображались с новым значением в конце одноготранзакция, поэтому вышеупомянутый подход разбиения UPDATE
на более мелкие транзакции будет хорошим подходом.
И да, INDEX
в соответствующих столбцах, указанных в предикате UPDATE
, будетпомощь значительно поможет.Опять же, отправьте EXPLAIN ANALYZE
, если вам нужна дополнительная помощь.