[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-zachem-nuzhny-vacuum-i-autovacuum":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1055,"zachem-nuzhny-vacuum-i-autovacuum",28,"postgresql","PostgreSQL","🐘","Зачем нужны VACUUM и AUTOVACUUM?","Из-за MVCC при UPDATE и DELETE старые версии строк не удаляются физически — они помечаются как «мёртвые» (dead tuples). VACUUM — это процесс очистки мёртвых версий строк и возврата освобождённого пространства для повторного использования.\n\n### Что делает VACUUM\n\n1. Помечает пространство от мёртвых строк как доступное для повторного использования (но **не возвращает** его ОС)\n2. Обновляет карту видимости (visibility map) — ускоряет Index Only Scan\n3. Обновляет карту свободного пространства (free space map)\n4. Предотвращает переполнение счётчика транзакций (transaction ID wraparound)\n\n```sql\nVACUUM transactions;                -- ручной VACUUM\nVACUUM VERBOSE transactions;        -- с подробностями\nVACUUM ANALYZE transactions;        -- VACUUM + обновление статистики\nVACUUM FULL transactions;           -- полная перестройка, возвращает место ОС\n-- ВНИМАНИЕ: VACUUM FULL блокирует таблицу (ACCESS EXCLUSIVE)!\n```\n\n### AUTOVACUUM\n\nAUTOVACUUM — фоновый процесс, который автоматически выполняет VACUUM и ANALYZE.\n\nФормула запуска: `dead_tuples > threshold + scale_factor * n_live_tup`\n\n\u003Cdetails>\u003Csummary>Настройка и мониторинг AUTOVACUUM\u003C\u002Fsummary>\n\n```sql\n-- Мониторинг\nSELECT\n    relname, n_dead_tup, n_live_tup,\n    last_vacuum, last_autovacuum,\n    last_analyze, last_autoanalyze\nFROM pg_stat_user_tables\nORDER BY n_dead_tup DESC;\n\n-- Настройка для конкретной таблицы (горячие таблицы)\nALTER TABLE transactions SET (\n    autovacuum_vacuum_scale_factor = 0.01,     -- 1% вместо 20%\n    autovacuum_vacuum_threshold = 1000,\n    autovacuum_analyze_scale_factor = 0.005\n);\n```\n\n\u003C\u002Fdetails>\n\n### Transaction ID Wraparound\n\nPostgreSQL использует 32-битный счётчик транзакций (~4 млрд). VACUUM обязан выполняться периодически, чтобы «заморозить» (freeze) старые транзакции и предотвратить переполнение. Если автовакуум не справляется, PostgreSQL может **остановить** приём новых транзакций для защиты данных.\n\n```sql\n-- Проверить возраст самой старой незамороженной транзакции\nSELECT datname, age(datfrozenxid) FROM pg_database ORDER BY age DESC;\n-- Если age приближается к 2 млрд — критическая ситуация!\n```\n\n**Никогда не отключайте AUTOVACUUM!** Вместо этого настройте его параметры для конкретных таблиц.\n\n> **На собеседовании:** связка MVCC -> dead tuples -> VACUUM -> wraparound показывает системное понимание PostgreSQL. Ключевые факты: VACUUM не возвращает место ОС (это делает только VACUUM FULL с блокировкой), AUTOVACUUM нельзя отключать из-за риска transaction ID wraparound.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Зачем нужны VACUUM и AUTOVACUUM? — Gymterview","Из-за MVCC при UPDATE и DELETE старые версии строк не удаляются физически — они помечаются как «мёртвые» (dead tuples). VACUUM — это процесс очистки мёртвых вер","Из-за MVCC при UPDATE и DELETE старые версии строк не удаляются физически — они помечаются как «мёртвые» (dead tuples). ",[7,13],"Из-за MVCC при UPDATE и DELETE старые версии строк не удаляются физически — они помечаются как «мёртвые» (dead tuples). VACUUM — это процесс очистки мёртвых версий строк и возврата освобождённого пространства для повторного использования.",true]