MVCC и причины раздувания
Разберитесь в многоверсионном управлении конкурентным доступом, узнайте, почему накапливаются мёртвые кортежи и как долгие транзакции вызывают раздувание
«MVCC и причины раздувания» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое MVCC?
Многоверсионное управление параллельным доступом. Вместо блокировок PostgreSQL хранит несколько версий строки. Читатели видят согласованный снимок, а записывающие операции создают новые версии, не блокируя читателей.
Как работает UPDATE
UPDATE не изменяет строку на месте:
- Помечает старую версию строки как «мёртвую» в транзакции T
- Записывает новую версию
- Другие транзакции видят ту версию, которую разрешает их снимок
Почему возникает раздувание
Мёртвые версии накапливаются. Таблица растёт, даже если количество строк остаётся прежним. Без очистки запросы постепенно просматривают всё больше мёртвых строк.
Когда VACUUM освобождает место
VACUUM помечает мёртвые строки как доступные для повторного использования (в пределах файла таблицы). Он НЕ уменьшает файлы, если только они не пусты полностью и находятся в конце. VACUUM FULL переписывает таблицу — устанавливает эксклюзивную блокировку и работает медленно.
Автоматический VACUUM
PostgreSQL запускает автоматический VACUUM в фоновом режиме. Он срабатывает, когда количество мёртвых строк превышает порог:
autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
-- vacuum when dead_rows > 50 + 0.2 * total_rowsНагрузки, вызывающие раздувание
- Большое количество операций UPDATE для небольших или часто изменяемых таблиц
- Крупные пакеты DELETE (для освобождения места нужен VACUUM)
- Долгие транзакции блокируют VACUUM, удерживая снимки
- Сеансы, простаивающие внутри транзакции, накапливают мёртвые строки в активно используемых таблицах
Диагностика раздувания
Расширение pgstattuple предоставляет точные показатели:
CREATE EXTENSION pgstattuple;
SELECT * FROM pgstattuple('orders');
-- table_len, tuple_count, dead_tuple_count, free_space, etc.
SELECT * FROM pgstatindex('orders_user_id_idx');Долгие транзакции блокируют VACUUM
VACUUM может очищать только строки, которые старше самой старой активной транзакции. Сеанс, простаивающий внутри транзакции 4 часа, означает 4 часа неосвобождённых мёртвых строк.
SELECT pid, state, xact_start, NOW() - xact_start AS duration
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction')
ORDER BY duration DESC NULLS LAST;Защита от переполнения
Идентификаторы транзакций имеют разрядность 32 бита. Если автоматический VACUUM не справляется, кластер сталкивается с «переполнением» и переходит в безопасный режим (принудительный VACUUM). Контролируйте:
SELECT datname, age(datfrozenxid) FROM pg_database
ORDER BY age(datfrozenxid) DESC;Логическое удаление ≠ физическое
DELETE помечает строки как мёртвые; место можно вернуть только с помощью VACUUM. Массовые операции DELETE без последующего VACUUM оставляют огромные скопления мёртвых строк.
Горячие обновления
Если Вы обновляете только неиндексированные столбцы и на той же странице есть свободное место, PostgreSQL выполняет горячее обновление HOT (Heap-Only Tuple) — без изменения индекса и с меньшим раздуванием.
Уменьшение раздувания
- Сокращайте продолжительность транзакций
- Избегайте широких UPDATE для индексированных столбцов (HOT не сможет сработать)
- Агрессивно настраивайте автовакуум для активно изменяемых таблиц
- Используйте pg_repack для переписывания таблицы без длительных блокировок
Итоги
MVCC обеспечивает параллельную работу за счёт накопления мёртвых строк.
- VACUUM очищает мёртвые строки
- Автовакуум необходим — не отключайте его
- Длительные транзакции блокируют очистку
- Для диагностики используйте pgstattuple
Быстрая проверка
Почему UPDATE не уменьшает размер таблицы, даже если изменяется только один столбец?
Часто задаваемые вопросы
Урок «MVCC и причины раздувания» бесплатный?
Да — полный текст урока «MVCC и причины раздувания» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «MVCC и причины раздувания»?
Разберитесь в многоверсионном управлении конкурентным доступом, узнайте, почему накапливаются мёртвые кортежи и как долгие транзакции вызывают раздувание Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «MVCC и причины раздувания»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- MVCC и причины раздувания
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE и pg_statistic
- Сканирование только по индексу и карта видимости