Чи може хтось пояснити різницю між цими типами VACUUM
в PostgreSQL?
Я читаю документ, але він просто говорить, що FULL
блокує таблиці та FREEZE
"заморожує" кортежі. Я думаю, що це те саме. Я помиляюся?
Чи може хтось пояснити різницю між цими типами VACUUM
в PostgreSQL?
Я читаю документ, але він просто говорить, що FULL
блокує таблиці та FREEZE
"заморожує" кортежі. Я думаю, що це те саме. Я помиляюся?
Відповіді:
Ось коротка стисла відповідь.
Vacuum full знімає ексклюзивний замок і відновлює стіл так, щоб на ньому не було порожніх блоків (ми будемо робити вигляд, що коефіцієнт заповнення становить 100% зараз).
Вакуумне заморожування позначає вміст таблиці дуже спеціальною часовою позначкою транзакцій, яка повідомляє постгресам, що її не потрібно пилососити ніколи. Наступне оновлення цього замороженого ідентифікатора зникне.
Наприклад, база даних template0 заморожена, оскільки вона ніколи не змінюється (за замовчуванням ви не можете підключитися до неї.)
Кожен так часто демон автовакууму перевірятиме базу даних та її таблиці, щоб побачити, що потрібно відхилити. Якщо таблиця буде заморожена у вакуумі, а потім ніколи не оновлюється, демон автовакуму просто передасть її. Також захист "обернути навколо" в postgresql також ніколи не запускатиметься на цей стіл.
tl; dr заморожування позначає таблицю такою, що не потребує жодного технічного обслуговування. Наступне оновлення розморозить його.
VACUUM FREEZE
потрібен ексклюзивний замок на столі? Здається, це має бути, інакше ви ризикуєте раптом зробити рядки з активних транзакцій глобально видимими. Я можу це нерозуміти ...
Щоб далі пояснити те, що написав Джаядеван.
Шлях Postgres працює з транзакціями та відслідковувати видимі дані - шляхом порівняння внутрішніх ідентифікаторів транзакцій. Однак, оскільки ці транзакції є 32-розрядним цілим числом рано чи пізно, вони завернуться, і тому нова транзакція буде виглядати так, як вона була зроблена в минулому (і таким чином буде видно в поточній транзакції, поки вона не повинна), в той час як старі транзакції виглядатимуть так, як вони робляться в майбутньому (а оскільки майбутнє ще не існує, дані більше не будуть видно).
Що потрібно зробити Postgres, щоб вирішити цю проблему, це присвоїти кожному рядку, який є достатньо старшим, щоб ризикувати страждати від цього обгортання, спеціальним ідентифікатором транзакції, який завжди старший за кожну транзакцію. Ви можете бачити, що якщо дійсний ідентифікатор коду варіюється від 0 до 2147483647, він встановить ідентифікатор транзакції для всіх поточних рядків до -1.
Однак оскільки вакуум в основному позначає порожній простір для повторного використання, він працює лише на сторінках даних, які були змінені.
Що VACUUM FREEZE
в основному, заморожуйте ідентифікатор транзакції для всіх сторінок, незалежно від того, були вони змінені чи ні, так що всі поточні рядки будуть сприйматися як старі для всіх нових транзакцій.
Однак версії 8.2 VACUUM FREEZE
застарілі і не повинні використовуватися. Замість цього є параметри vacuum_freeze_table_age
і autovacuum_freeze_max_age
що визначає , скільки транзакцій може статися до того, як повне сканування робиться на столі (фактично зробити внутрішній VACUUM FREEZE
на столі).
VACUUM FREEZE
застарілість / відсторонення?
Скопіюйте / вставте з відповіді, коли я поставив те саме запитання - "звичайний вакуум позначає порожній простір для повторного використання і повертає порожній пробіл в кінці співвідношення. Отже, якщо порожній пробіл знаходиться посередині тощо, це не може бути відновлений щойно використаний.
вакуум повний ущільнює відношення відновлення всього порожнього простору. Він вимагає ексклюзивного блокування і через це погано для виробничих систем.
Тому мета РЕГУЛЯРНОГО вакууму полягає не в тому, щоб повернути простір з таблиць, а зробити його доступним для повторного використання пізніше. Метою вакууму ПОВНОМ є повернення всього марно витраченого простору за рахунок ексклюзивних характеристик блокування та db, поки це відбувається.
Отже, оскільки звичайний вакуум не призначений для повернення всього, ви не повинні дивуватися, що він насправді не повертав все. Спробуйте експериментувати на великих наборах даних із більшою кількістю випадкових видалень тощо, щоб побачити різницю між регулярним та повним вакуумом. "
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
Щоб додати до цього, вакуумний повний фактично створить нові файли для таблиці (існуючі файли зменшилися б до 0 розміру). Таким чином ОС може повернути простір.
VACUUM FREEZE
зокрема.