В некоторых случаях, и после создания массива update
, insert
или delete
из таблицы, я начал, VACUUM FULL ANALYZE
чтобы убедиться, что БД не стала слишком раздутой. Выполнение этого в производственной базе данных позволило мне обнаружить, что это не очень хорошая идея, потому что я мог заблокировать таблицу на длительный период времени. Итак, я отменил процесс, может быть, попробовал просто VACUUM
(не полный) или позвольте AUTOVACUUM
сделать позже все, что он может сделать.
Вопрос заключается в следующем: если я остановлю VACUUM или AUTOVACUUM на полпути, потеряна ли уже вся обработка?
Например, если VACUUM
уже найдено 1 М мертвых строк, и я остановил это, вся эта информация потеряна? Работает ли VACUUM полностью транзакционным способом («все или ничего», как очень большое количество процессов PostgreSQL)?
Если VACUUM можно безопасно прервать без потери всей работы, есть ли способ сделать vacuum
работу постепенно? [Работать в течение 100 мс, остановиться, подождать 10 мс, чтобы разрешить неблокирование остального мира ... и т. Д.]. Я знаю, что вы можете сделать часть этого, настраивая параметры автоочистки, но я думаю о том, чтобы иметь возможность программно управлять этим, чтобы иметь возможность делать это в определенное время / при определенных условиях.
ПРИМЕЧАНИЕ. Остановить / отменить / убить процесс означает в этом контексте:
- При использовании pgAdmin нажмите кнопку «Отменить запрос».
- Если вы работаете программно, вызовите pg_cancel_backend ().
Я предполагаю, что оба эквивалентны. Я не использовал команду уничтожения на уровне оболочки или системы.
источник
vacuum_cost_page_hit
иvacuum_cost_page_miss
на ноль.