Я бы сказал вне транзакции. Конечно, в PostgreSQL VACUUM предназначен для удаления «мертвых» кортежей (т. Е. Старой строки, когда запись была изменена или удалена).
Если вы используете VACUUM в транзакции, которая изменила записи, эти мертвые строки не будут помечены для удаления.
В зависимости от того, какой тип VACUUM вы используете, может также потребоваться блокировка таблицы, которая будет блокироваться, если выполняются другие транзакции, поэтому вы можете потенциально оказаться в тупиковой ситуации (транзакция 1 заблокирована в ожидании таблицы блокировка для выполнения VACUUM, транзакция 2 блокируется в ожидании освобождения строки, которую заблокировала транзакция 1.)
Я бы также рекомендовал, чтобы это не делалось в приложении (возможно, как запланированное задание), так как это может занять некоторое время и может негативно повлиять на скорость других запросов.
Что касается SQL Server, то нет VACUUM - то, что вы ищете - это сжатие. Вы можете включить автоматическое сжатие в 2005 году, которое будет автоматически восстанавливать пространство, когда это решит сервер, или выдавать инструкцию DBCC для сжатия базы данных и файла журнала, но это зависит от процедуры резервного копирования и стратегии на уровне базы данных.