MVCC и VACUUM в PostgreSQL
Вопрос
Расскажите, как в PostgreSQL устроен MVCC, откуда берутся мёртвые строки и зачем нужен VACUUM.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`UPDATE` создаёт новую версию строки, старая остаётся с `xmax`; `DELETE` только помечает версию
Каждая транзакция видит версии по своему снимку, поэтому чтение не блокирует запись и наоборот
VACUUM удаляет версии, которые уже никому не видны, обновляет visibility map и замораживает старые строки
Долгие транзакции и забытые слоты репликации мешают очистке и раздувают таблицы
Autovacuum настраивают по таблицам: `autovacuum_vacuum_scale_factor`, лимиты стоимости; мониторинг через `pg_stat_user_tables`
HOT-обновления и `fillfactor` уменьшают нагрузку на индексы
Что могут спросить следом
- Чем
VACUUM FULLотличается от обычного? - Почему Index Only Scan иногда ходит в таблицу?
- Что такое HOT update и когда он невозможен?
Разбор
В PostgreSQL строки не перезаписываются на месте. UPDATE пишет новую версию строки, а в старой проставляет xmax, номер транзакции, которая её заменила. Каждая транзакция видит версии согласно своему снимку, поэтому читатели не ждут писателей. Плата за это мёртвые версии: после завершения всех транзакций, которые могли их видеть, они занимают место впустую. VACUUM находит их и отдаёт место под новые строки, чистит ссылки в индексах, обновляет visibility map (нужна Index Only Scan) и замораживает старые строки, чтобы избежать переполнения счётчика транзакций. Autovacuum запускается, когда мёртвых строк больше порога, по умолчанию 20% таблицы плюс 50 строк; для больших горячих таблиц порог снижают индивидуально. Очистке мешают долгие транзакции, idle in transaction, забытые слоты репликации. Чтобы обновления меньше трогали индексы, оставляют место на странице через fillfactor: тогда возможен HOT update, если не меняются индексированные колонки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Долгая транзакция и раздувание таблиц
Следующий вопрос
VACUUM или VACUUM FULL на проде
Термины по теме
Ещё по теме «Транзакции и изоляция»
- Advisory-блокировки в PostgreSQL
- Как избежать deadlock при переводах
- Взаимоблокировки: как ловить и предотвращать
- Зачем нужна заморозка и что такое wraparound
- Что делает PostgreSQL при deadlock
- Уровень изоляции по умолчанию в PostgreSQL
- Как обеспечивается Durability
- ACID