Что такое VACUUM в PostgreSQL
Что проверяют
Понимаете ли вы, что PostgreSQL версионирует строки, а не правит их на месте. На собеседовании по C# вопрос почти всегда идёт следом за рассказом про ORM: смотрят, видите ли вы базу за абстракцией и не переносите ли на неё привычки из других СУБД.
Как отвечать
Кратко про модель: обновление создаёт новую версию строки, прежняя живёт, пока её может увидеть хоть одна открытая транзакция. Очистка помечает такие версии как свободное место внутри файла, обновляет карту видимости и замораживает номера транзакций. Обычный вариант не мешает чтению и записи, но файл не уменьшает; VACUUM FULL уменьшает, зато переписывает таблицу под блокировкой, при которой к ней не обратиться. В работающей системе этим занимается автоочистка, её пороги настраиваются на конкретную таблицу.
Дальше переходите к приложению, ради чего вопрос и задан. Мёртвые версии строк порождает ваш код: счётчик, обновляемый на каждый запрос, фоновая задача, переписывающая таблицу целиком, сохранение всей сущности целиком при изменении одного поля. Удерживают очистку долгие транзакции: область, открытая на весь запрос и охватывающая поход во внешний сервис, или соединение, возвращённое в пул без подтверждения. Смотреть это стоит по счётчику мёртвых строк и времени последней автоочистки в системных представлениях и по соединениям в состоянии простоя внутри транзакции.
Полезно проговорить и разницу с SQL Server, откуда многие приходят: там обновление правит страницу на месте, версии строк живут отдельно, а сжатие файла считается обычной операцией обслуживания. Перенос этих привычек и рождает совет сжать базу, который тут ничего не лечит.
Где спотыкаются
Считают, что ORM избавляет от знания базы. В итоге растягивают время жизни транзакции ради удобства кода, и вся база перестаёт чиститься из-за одного долгого запроса в фоне.
Второе: ставят VACUUM FULL в миграцию при выкладке. Таблица блокируется целиком, приложение получает таймауты, а места под вторую копию таблицы может не хватить.
Третье: ждут от очистки перестроения индексов. Индексы тоже распухают, но им нужна отдельная операция перестроения, которую делают без долгой блокировки.