Заморожування вакууму проти вакууму ПОВНО


18

Чи може хтось пояснити різницю між цими типами VACUUMв PostgreSQL?

Я читаю документ, але він просто говорить, що FULLблокує таблиці та FREEZE"заморожує" кортежі. Я думаю, що це те саме. Я помиляюся?


Ви прочитали документа? Це була б ідеальна можливість включити посилання на прочитане ...
Ервін Брандстеттер

Відповіді:


12

Ось коротка стисла відповідь.

Vacuum full знімає ексклюзивний замок і відновлює стіл так, щоб на ньому не було порожніх блоків (ми будемо робити вигляд, що коефіцієнт заповнення становить 100% зараз).

Вакуумне заморожування позначає вміст таблиці дуже спеціальною часовою позначкою транзакцій, яка повідомляє постгресам, що її не потрібно пилососити ніколи. Наступне оновлення цього замороженого ідентифікатора зникне.

Наприклад, база даних template0 заморожена, оскільки вона ніколи не змінюється (за замовчуванням ви не можете підключитися до неї.)

Кожен так часто демон автовакууму перевірятиме базу даних та її таблиці, щоб побачити, що потрібно відхилити. Якщо таблиця буде заморожена у вакуумі, а потім ніколи не оновлюється, демон автовакуму просто передасть її. Також захист "обернути навколо" в postgresql також ніколи не запускатиметься на цей стіл.

tl; dr заморожування позначає таблицю такою, що не потребує жодного технічного обслуговування. Наступне оновлення розморозить його.


Отже, чи VACUUM FREEZEпотрібен ексклюзивний замок на столі? Здається, це має бути, інакше ви ризикуєте раптом зробити рядки з активних транзакцій глобально видимими. Я можу це нерозуміти ...
Парфянський постріл

Ніякого заморожування вакууму не відбувається, вакууму повністю.
Скотт Марлоу

6

Щоб далі пояснити те, що написав Джаядеван.

Шлях Postgres працює з транзакціями та відслідковувати видимі дані - шляхом порівняння внутрішніх ідентифікаторів транзакцій. Однак, оскільки ці транзакції є 32-розрядним цілим числом рано чи пізно, вони завернуться, і тому нова транзакція буде виглядати так, як вона була зроблена в минулому (і таким чином буде видно в поточній транзакції, поки вона не повинна), в той час як старі транзакції виглядатимуть так, як вони робляться в майбутньому (а оскільки майбутнє ще не існує, дані більше не будуть видно).

Що потрібно зробити Postgres, щоб вирішити цю проблему, це присвоїти кожному рядку, який є достатньо старшим, щоб ризикувати страждати від цього обгортання, спеціальним ідентифікатором транзакції, який завжди старший за кожну транзакцію. Ви можете бачити, що якщо дійсний ідентифікатор коду варіюється від 0 до 2147483647, він встановить ідентифікатор транзакції для всіх поточних рядків до -1.

Однак оскільки вакуум в основному позначає порожній простір для повторного використання, він працює лише на сторінках даних, які були змінені.

Що VACUUM FREEZEв основному, заморожуйте ідентифікатор транзакції для всіх сторінок, незалежно від того, були вони змінені чи ні, так що всі поточні рядки будуть сприйматися як старі для всіх нових транзакцій.

Однак версії 8.2 VACUUM FREEZEзастарілі і не повинні використовуватися. Замість цього є параметри vacuum_freeze_table_ageі autovacuum_freeze_max_ageщо визначає , скільки транзакцій може статися до того, як повне сканування робиться на столі (фактично зробити внутрішній VACUUM FREEZEна столі).


3
Як це так, що документи не згадують про VACUUM FREEZEзастарілість / відсторонення?
dezso

Цікаво. Це було зроблено для версій між 8.2 та 9.0. Можливо, вони зняли депресію, бо це може бути хорошою рисою.
Джиммі Стенке

1

Скопіюйте / вставте з відповіді, коли я поставив те саме запитання - "звичайний вакуум позначає порожній простір для повторного використання і повертає порожній пробіл в кінці співвідношення. Отже, якщо порожній пробіл знаходиться посередині тощо, це не може бути відновлений щойно використаний.

вакуум повний ущільнює відношення відновлення всього порожнього простору. Він вимагає ексклюзивного блокування і через це погано для виробничих систем.

Тому мета РЕГУЛЯРНОГО вакууму полягає не в тому, щоб повернути простір з таблиць, а зробити його доступним для повторного використання пізніше. Метою вакууму ПОВНОМ є повернення всього марно витраченого простору за рахунок ексклюзивних характеристик блокування та db, поки це відбувається.

Отже, оскільки звичайний вакуум не призначений для повернення всього, ви не повинні дивуватися, що він насправді не повертав все. Спробуйте експериментувати на великих наборах даних із більшою кількістю випадкових видалень тощо, щоб побачити різницю між регулярним та повним вакуумом. "

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

Щоб додати до цього, вакуумний повний фактично створить нові файли для таблиці (існуючі файли зменшилися б до 0 розміру). Таким чином ОС може повернути простір.


2
Питання задається VACUUM FREEZEзокрема.
Ервін Брандстеттер

Правда - "різниця між цими типами вакууму в PostgreSQL" - я подумав, що питання стосується відмінностей між типами вакууму.
Jayadevan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.