Выбор ответа Senior Проектирование и нормализация обновлено

Удаление старых данных: DELETE или партиции

Вопрос

Таблица логов растёт на 50 млн строк в месяц, хранить нужно 6 месяцев. Почему для этого советуют партиционирование по месяцам?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Старый месяц удаляется DROP партиции быстро, без мусора и WAL. Массовый DELETE помечает каждую строку мёртвой, пишет WAL на каждую, раздувает таблицу и индексы, а потом VACUUM должен всё это вычистить.

Варианты ответа

  1. Старый месяц удаляется DROP партиции быстро, без мусора и WALправильный ответ
  2. Партиционированные таблицы сами удаляют партиции старше срока
  3. Партиции хранятся сжатыми, и логи занимают меньше места
  4. В партиционированной таблице DELETE не пишет в WAL

Разбор

Массовый DELETE помечает каждую строку мёртвой, пишет WAL на каждую, раздувает таблицу и индексы, а потом VACUUM должен всё это вычистить. Удаление партиции (DETACH PARTITION и DROP TABLE) это удаление файлов: быстро и без мусора. С PostgreSQL 14 есть DETACH PARTITION ... CONCURRENTLY, чтобы не брать тяжёлую блокировку на родителя. Автоматически партиции не создаются и не удаляются: это делают по расписанию сами или расширением pg_partman. Сжатия у партиций нет, а DELETE пишет WAL везде. Ещё плюс: запросы с условием по created_at читают только нужные партиции (partition pruning).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.