Що таке 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