Postgresql явный VACUUM против автоматического VACUUM: различия? Рекомендации?

Быстрый вопрос от новичка PostgreSQL (относительного):

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

Дисковое пространство - это проблема, поэтому мы должны убедиться, что PostgreSQL убирает после себя.

Есть ли разница между явным вызовом VACUUM в конце пакета, кроме принуждения PostgreSQL к более быстрой сборке мусора, и предоставлением возможности демону auto-VACUUM обрабатывать его? Есть ли причина рекомендовать один подход по сравнению с другим?

Спасибо!


person Jim Burnell    schedule 08.01.2018    source источник
comment
Ручной ВАКУУМ будет немного сложнее для ввода-вывода, чем автовакуум, поскольку последний предназначен для минимизации воздействия на сервер. Обратите внимание, что ВАКУУМ / автоочистка не освобождает пространство, они просто помечают слоты как готовые к повторному использованию. Если вам действительно нужно освободить место, вы, вероятно, захотите исследовать КЛАСТЕР, ПОЛНЫЙ ВАКУУМ и т. Д.   -  person bma    schedule 08.01.2018
comment
Вдобавок: возможно, вы можете записать окончательные результаты в новую таблицу и отбросить старую, а не удалять большую часть таблицы. Это может быть быстрее, и пространство будет освобождено автоматически.   -  person Laurenz Albe    schedule 09.01.2018


Ответы (1)


Когда-то был один вакуум, полный и блокирующий. Потом ребята из PostgreSQL добавили неблокирующий вакуум. Но все равно приходилось планировать это самостоятельно.

Затем какой-то гений создал демона, который автоматически запускал для вас вакуум, когда в этом нуждались таблицы. Он использует ту же самую команду вакуума, которую использовали бы вы или я, но имеет множество настроек, особенно по умолчанию, которые делают его медленнее и менее навязчивым. В первую очередь эти настройки предназначены для рабочих потоков (по умолчанию 3), стоимости задержки (20 мс для автовакуумирования, 0 мс для обычного вакуума) и предела задержки стоимости автоочистки (-1, т. Е. Используйте системную настройку, равную 200).

Следовательно, обычная очистка ОЧЕНЬ агрессивна, не требует затрат и будет работать настолько быстро и быстро, насколько позволит ваша подсистема ввода-вывода. Он в основном конкурирует с вашей обычной рабочей нагрузкой за пропускную способность ввода-вывода.

Как правило, в вашей ситуации вы можете сделать одно из двух:

Первый: сделать автовакуум более агрессивным. При понижении autovacuum_vacuum_cost_delay с 20 до диапазона от 2 до 5 он будет работать намного быстрее, но при этом не будет слишком сильно мешать.

Второй: запускайте обычный пылесос вручную. Поскольку обычные пылесосы по умолчанию не имеют cost_delay, это будет самым быстрым, но и самым разрушительным.

Решение остается за вами на основе моделей использования и т. Д.

person Scott Marlowe    schedule 09.01.2018