Що таке VACUUM у PostgreSQL?

ЗмістНатисність на посилання, щоб перейти до потрібного місця
У PostgreSQL є механізм MVCC (більш детальніше розкажу нижче) - багатоверсійність рядків. Коли ви оновлюєте або видаляєте дані, старі версії рядків не зникають одразу. Вони залишаються у файлах таблиць як "мертвий вантаж". З часом таких рядків стає багато, таблиці роздуваються, індекси втрачають ефективність, а запити починають працювати повільніше.
Щоб підтримувати базу в здоровому стані, PostgreSQL використовує процес VACUUM. Він видаляє невикористані версії рядків, звільняє простір і допомагає оновлювати статистику для планувальника запитів. Це своєрідне прибирання, яке запускати вручну майже не потрібно, бо зазвичай працює автоматичний autovacuum.
Існує також VACUUM FULL - більш радикальна версія. Вона не лише очищає "сміття", а й фізично перебудовує таблицю, повертаючи місце файловій системі. Ціна — повне блокування таблиці на час операції. Тому FULL використовують рідко і переважно в нічні вікна або після масових видалень.
Без VACUUM PostgreSQL поступово деградує: таблиці ростуть, індекси втрачають точність, запити стають повільними, а autovacuum може почати працювати занадто агресивно. Тому VACUUM - не просто технічний інструмент, а базовий механізм, який дозволяє PostgreSQL зберігати продуктивність на довгі роки.

MVCC (Multi-Version Concurrency Control) 

MVCC (Multi-Version Concurrency Control) - це спосіб, яким PostgreSQL та інші СУБД дозволяють багатьом клієнтам одночасно читати й змінювати дані без блокувань, що паралізують роботу.
У звичайних базах без MVCC одночасний запис і читання можуть створювати конфлікти. MVCC вирішує це так: коли ви оновлюєте рядок, база не переписує його поверх старого, а створює нову версію. Стара лишається доступною для тих транзакцій, які її ще "бачать". Кожна транзакція працює з власним знімком даних, не заважаючи іншим.
Перевага проста - читачі не блокують запис, а запис не блокує читачів. Саме тому PostgreSQL може обробляти велику кількість паралельних операцій без істотних затримок.
Недолік теж очевидний - старі версії накопичуються. І саме VACUUM відповідає за те, щоб ці "мертві" рядки видаляти та підтримувати базу в чистому стані.

Цей допис поки що не має жодних доповнень від автора/ки.

Змінні у Ruby: @, @@ та class instance variable
30 жовт., 20:54

Змінні у Ruby: @, @@ та class instance variable

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Різниця між blank?, present?, empty? та nil? у Ruby
30 жовт., 21:06

Різниця між blank?, present?, empty? та nil? у Ruby

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Middleware у Ruby on Rails і коли воно використовується
04 лист., 10:39

Що таке Middleware у Ruby on Rails і коли воно використовується

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Vanilla Rails approach?
14 лист., 16:48

Що таке Vanilla Rails approach?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Elasticsearch і як він працює?
22 лист., 12:35

Що таке Elasticsearch і як він працює?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке time-series база даних?
22 лист., 12:42

Що таке time-series база даних?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке B-Tree (Balanced Tree)?
22 лист., 12:58

Що таке B-Tree (Balanced Tree)?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Фікс проблеми встановлення Ruby 3.4.3 (і не тільки) через RVM на macOS (Apple Silicon)
30 груд., 14:05

Фікс проблеми встановлення Ruby 3.4.3 (і не тільки) через RVM на macOS (Apple Silicon)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Thundering Herd Problem: що це таке і чому він ламає продакшен
15 січ., 10:14

Thundering Herd Problem: що це таке і чому він ламає продакшен

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Exponential Backoff і Random Jitter?
15 січ., 15:24

Що таке Exponential Backoff і Random Jitter?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Підключення сервісу Elasticsearch до Rails-додатку (Coolify у хмарі, сервер на Hetzner).
15 лют., 13:45

Підключення сервісу Elasticsearch до Rails-додатку (Coolify у хмарі, сервер на Hetzner).

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
 "No space left on device" - коли Docker з'їв весь диск
15 лют., 19:57

"No space left on device" - коли Docker з'їв весь диск

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska