VACUUM

PostgreSQL :: VACUUM

Со временем многим приходится сталкиваться в работе с большими базами данных, в которых некоторые таблицы особенно часто изменяются – добавляются новые записи, удаляются старые, обновляются существующие. Все это приводит к внутренней фрагментации таблицы. После обновления и удаления появляются пробелы, которые не заполняются. Новые записи добавляются в конец таблицы. Все это приводит к разбуханию и снижению производительности.

Что бы бороться с этим в PostgreSQL есть такая функция как VACUUM. VACUUM – это сборщик мусора и оптимизатор таблиц базы данных. VACUUM возвращает место, которые занимают мертвые кортежи. При нормальной работе PostgreSQL, кортежи, которые удалены или устарели по причине обновления не удаляются физически из таблицы. Они остаются в файле до тех пор, пока не будет проведена операция VACUUM. Поэтому так важно делать операцию VACUUM, особенно для часто обновляемых таблиц.

Из документации PostgreSQL, операция VACUUM имеет следующий синтаксис:


VACUUM [ ( { FULL | FREEZE | VERBOSE | ANALYZE } [, ...] ) ] [ table [ (column [, ...] ) ] ]

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]

При отсутствии параметра VACUUM обрабатывает каждую таблицу в текущей базе данных. (Но только тех, к которым имеет право доступа текущий пользователь). С параметром, VACUUM обрабатывает только конкретная таблица, указанная в параметрах.

Простая команда VACUUM (без указания параметра FULL), просто высвобождает пространство и делает его доступным для повторного использования. Эта форма команды может работать параллельно с обычным чтением и записью таблицы, так как в таком случае монопольная блокировка (exclusive lock) на таблицах не выполняется. Таким образом, дополнительное пространство не возвращается операционной системы (в большинстве случаев). Т.е. после такой команды все освобожденное место в любой части файла снов адоступно для создания новых кортежей в той же таблице, в которой находится это освобожденное место.

Команда VACUUM FULL переписывает все содержимое таблицы в новый файл на диске. Новый файл таблицы не имеет свободного пространства, т.е. так же происходит дефрагментация внутренней структуры таблицы. Эта форма команды гораздо медленнее и требует исключительной блокировки на каждой таблице, в то время как она обрабатывается.

Когда список параметров окружен круглыми скобками, параметры комманды могут быть записаны в любом порядке. Без круглых скобок, параметры должны быть указаны в точном порядке, указанном выше. Синтаксис круглых скобок был добавлен в PostgreSQL 9.0. Старый синтаксис без круглых скобок в новых версиях PostreSQL не желателен.

Теперь немного о параметрах команды:

FULL
Эта опция включает «полную» очистку, при которой происходит дефрагментация таблицы и возвращается большее количество свободного места. Все свободное место возвращается операционной системе (освобождается место на жестком диске). Минусы данной опции – медленнее работает команда (на реально больших таблицах может занять несколько минут, и даже часов). При этом обрабатываемая таблица блокируется с помощью эксклюзивной блокировки, что запрещает запись и чтение данных. Т.е. во время такой операции таблица становится недоступна, что в большинстве случаем недопустимо, особенно на системе с большой загрузкой. Этот метод также требует дополнительного дискового пространства, так как он записывает новую копию таблицы и не освобождает старую копию, пока операция не будет завершена. Как правило, эта опция должно быть использована только тогда, когда значительное количество пространства должно быть утилизирован внутри таблицы.

FREEZE
Делает агрессивное «замораживание» кортежей. Указание FREEZE эквивалентно выполнению VACUUM с параметром vacuum_freeze_min_age равным нулю.

VERBOSE
Печать подробный отчет о выполнении команды для каждой таблицы.

ANALYZE
Обновляет статистику, которая используется планировщиком, чтобы определить наиболее эффективный способ выполнения запроса.

table
Имя конкретной таблицы для обработки командой VACUUM. Значения по умолчанию — все таблицы в текущей базе данных.

column
Название конкретного столбца для анализа. По умолчанию — все столбцы. Если список столбцов указано, ANALYZE подразумевается.

Некоторые замечания

Команда VACUUM будет пропускать все таблиц, для которых пользователь, запустивший команду, не имеет прав доступа.

Так же эта команда не может быть выполнена внутри блока транзакции.

Команда PostgreSQL рекомендует делать VACUUM почаще, например по ночам (для этого есть автоматический VACUUUM, о котором мы поговорим позже). После добавления или удаления большого количества строк следует выполнять команду VACUUM ANALYZE для таких таблиц. Это обновит системные каталоги с результатами всех последних изменений, и позволит планировщику запросов сделать лучший выбор при составлении плана SQL запросов.

FULL вариант не рекомендуется для повседневного использования, но в некоторых случаях может быть очень полезен. Например, вы удалили или обновили большинство строк в таблице. В таком случае эта команда поможет освободить большее количества места на диске и сделает доступ к данным быстрее.

Так же следует помнить, что VACUUM приводит к существенному увеличению трафика ввода / вывода, что может привести к снижению производительности для других активных сессий базы данных и других приложений на сервере.

Так же PostgreSQL включает в себя «AUTOVACUUM». Это отличная штука, которая может автоматизировать плановое техническое обслуживание базы данных при помощи команды VACUUM. Об этой команде мы еще поговорим в других статьях.

Добавить комментарий

Ваш e-mail не будет опубликован.