К нам обратился заказчик, у которого в базе данных PostgreSQL была большая таблица, предназначенная для хранения исторических данных. По принятой внутренней политике, эти данные необходимо хранить в течение трёх месяцев, а затем удалять устаревшие записи. Для удаления использовался классический метод DELETE.
Раз в месяц специалисты заказчика запускали процедуру очистки, которая шла десятки часов и сильно перегружала базу. После удаления миллионов строк автоматически запускался autovacuum, пытающийся освободить пространство от «призрачных» записей.
Однако на практике свободное место на диске не возвращалось в полном объёме, а фрагментация(«bloat») в таблице и индексах стремительно росла. Вместе с ней повышались и затраты на дорогие дисковые хранилища.