Удаление старых данных: DELETE или партиции
Вопрос
Таблица логов растёт на 50 млн строк в месяц, хранить нужно 6 месяцев. Почему для этого советуют партиционирование по месяцам?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Старый месяц удаляется
DROPпартиции быстро, без мусора и WALправильный ответ - Партиционированные таблицы сами удаляют партиции старше срока
- Партиции хранятся сжатыми, и логи занимают меньше места
- В партиционированной таблице
DELETEне пишет в WAL
Разбор
Массовый DELETE помечает каждую строку мёртвой, пишет WAL на каждую, раздувает таблицу и индексы, а потом VACUUM должен всё это вычистить. Удаление партиции (DETACH PARTITION и DROP TABLE) это удаление файлов: быстро и без мусора. С PostgreSQL 14 есть DETACH PARTITION ... CONCURRENTLY, чтобы не брать тяжёлую блокировку на родителя. Автоматически партиции не создаются и не удаляются: это делают по расписанию сами или расширением pg_partman. Сжатия у партиций нет, а DELETE пишет WAL везде. Ещё плюс: запросы с условием по created_at читают только нужные партиции (partition pruning).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
NOT NULL на огромной таблице без простоя
Следующий вопрос
Первичный ключ в партиционированной таблице
Термины по теме
Ещё по теме «Проектирование и нормализация»
- Нарушение второй нормальной формы
- Транзитивная зависимость
- Денормализация
- Нормализация
- Суррогатный ключ
- Связь многие ко многим
- Тип для денег
- ON DELETE CASCADE