VACUUM
Выполняет сборку мусора и, при необходимости, анализирует базу данных.
Синтаксис
VACUUM [({ FULL | FREEZE | VERBOSE | ANALYZE } [, ...])] [<table> [(<column> [, ...] )]]
VACUUM [FULL] [FREEZE] [VERBOSE] [<table>]
VACUUM [FULL] [FREEZE] [VERBOSE] ANALYZE
[<table> [(<column> [, ...] )]]
Описание
VACUUM освобождает пространство, занятое устаревшими ("мертвыми") кортежами. При обычных операциях Greengage DB кортежи, удаленные или устаревшие в результате обновления, физически не удаляются из таблицы; они остаются на диске до тех пор, пока не будет выполнена команда VACUUM. Поэтому необходимо периодически выполнять команду VACUUM, особенно для часто изменяемых таблиц.
Без параметров команда VACUUM обрабатывает все таблицы в текущей базе данных. С параметрами команда VACUUM обрабатывает только указанную таблицу.
Команда VACUUM ANALYZE выполняет сначала VACUUM, а затем ANALYZE для каждой указанной таблицы. Это удобная комбинация для планового обслуживания. Дополнительную информацию об анализе можно посмотреть в описании ANALYZE.
Команда VACUUM без FULL помечает удаленные и устаревшие данные в таблицах и индексах для повторного использования в будущем и освобождает пространство для повторного использования только в том случае, если это пространство находится в конце таблицы и легко получить эксклюзивную блокировку таблицы. Неиспользуемое пространство в начале или середине таблицы остается неизменным. В случае heap-таблиц эта форма команды может работать параллельно с обычным чтением и записью таблицы, так как эксклюзивная блокировка не требуется. Однако дополнительное пространство не возвращается операционной системе (в большинстве случаев); оно просто остается доступным для повторного использования в рамках той же таблицы. VACUUM FULL перезаписывает все содержимое таблицы в новый файл на диске без дополнительного пространства, позволяя вернуть неиспользуемое пространство операционной системе. Эта форма намного медленнее и требует эксклюзивной блокировки для каждой обрабатываемой таблицы.
При использовании оптимизированных для добавления (Append-optimized, AO) таблиц команда VACUUM выполняет уплотнение таблицы, сначала вакуумируя индексы, затем последовательно уплотняя файл каждого сегмента и, наконец, удаляя вспомогательные связи и обновляя статистику. В каждом сегменте видимые строки копируются из текущего файла сегмента в новый файл сегмента, после чего планируется удаление текущего файла сегмента, а новый файл сегмента становится доступным. Обычная команда VACUUM для AO-таблицы позволяет выполнять сканирование, вставку, удаление и обновление таблицы во время уплотнения файла сегмента. Однако для удаления текущего файла сегмента и активации нового файла сегмента кратковременно устанавливается блокировка ACCESS EXCLUSIVE.
Операция VACUUM FULL выполняет более интенсивную обработку, включая перемещение кортежей между блоками для уплотнения таблицы до минимального количества блоков на диске. Этот способ обработки значительно медленнее и требует блокировки ACCESS EXCLUSIVE для каждой таблицы во время ее обработки. Блокировка ACCESS EXCLUSIVE гарантирует, что только одна транзакция имеет доступ к таблице каким-либо образом.
Когда список параметров заключен в скобки, параметры можно записывать в любом порядке. Без скобок параметры должны быть указаны точно в том порядке, который показан выше. Синтаксис без скобок считается устаревшим.
Выводимая информация
При указании VERBOSE команда VACUUM выводит сообщения о процессе выполнения, указывая, какая таблица в данный момент обрабатывается. Также выводится различная статистика по таблицам.
Параметры
| Параметр | Описание |
|---|---|
FULL |
Выполняет полную очистку, которая может освободить больше пространства, но занимает гораздо больше времени и запрашивает эксклюзивную блокировку таблицы. Этот режим также требует дополнительного дискового пространства, поскольку он записывает новую копию таблицы и не освобождает старую до завершения операции. Обычно его следует использовать только тогда, когда необходимо освободить значительное количество пространства, выделенного таблице |
FREEZE |
Указание |
VERBOSE |
Выводит подробный отчет об очистке для каждой таблицы |
ANALYZE |
Обновляет статистику, используемую планировщиком для определения наиболее эффективного способа выполнения запроса |
table |
Имя (опционально указанное со схемой) таблицы, подлежащей очистке. По умолчанию все таблицы в текущей базе данных |
column |
Имя конкретного столбца, подлежащего анализу. По умолчанию анализируются все столбцы. Если указан список столбцов, подразумевается использование команды |
Примечания
Команда VACUUM не может быть выполнена внутри блока транзакций.
Рекомендуется регулярно (по крайней мере, раз в сутки) проводить вакуумирование всех активных баз данных для удаления устаревших строк. После добавления или удаления большого количества строк может быть полезно выполнить команду VACUUM ANALYZE для соответствующей таблицы. Это обновит системные каталоги с учетом результатов всех последних изменений и позволит оптимизатору запросов Greengage DB принимать более эффективные решения при планировании запросов.
В PostgreSQL есть отдельный опциональный серверный процесс, называемый демоном автовакуума, предназначенный для автоматизации выполнения команд VACUUM и ANALYZE. Greengage DB позволяет демону автовакуума выполнять операции VACUUM только над шаблонной базой данных Greengage DB template0. Автовакуум включен для template0, поскольку соединения с template0 запрещены. Демон автовакуума выполняет операции VACUUM над template0 для управления идентификаторами транзакций (XID) и предотвращения проблем с переполнением идентификаторов транзакций в template0.
Для управления идентификаторами транзакций (XID) в пользовательских базах данных необходимо вручную выполнять операции VACUUM.
Операция VACUUM приводит к существенному увеличению объема операций ввода-вывода, что может снизить производительность других активных сессий. Поэтому рекомендуется выполнять очистку базы данных в периоды низкой загрузки.
Команды VACUUM пропускают сторонние (foreign) и внешние (external) таблицы.
Операция VACUUM FULL освобождает все пространство, занимаемое устаревшими строками, однако она требует эксклюзивной блокировки каждой обрабатываемой таблицы, является очень ресурсоемкой операцией и может занять много времени при выполнении на больших распределенных таблицах Greengage DB. Рекомендуется выполнять операции VACUUM FULL во время планового обслуживания базы данных.
Опция FULL не рекомендуется для повседневного использования, но может быть полезна в особых случаях. Например, когда вы удалили или изменили большинство строк в таблице и хотите, чтобы таблица физически уменьшилась в размере (чтобы таблица занимала меньше места на диске и ускорилось ее сканирование). VACUUM FULL обычно уменьшает размер таблицы больше, чем обычная команда VACUUM.
В качестве альтернативы команде VACUUM FULL можно создать таблицу заново с помощью оператора CREATE TABLE AS и удалить старую таблицу.
Для AO-таблиц VACUUM требует достаточного свободного пространства на диске для размещения нового файла сегмента во время процесса VACUUM. Если отношение количества скрытых строк к общему количеству строк в файле сегмента меньше порогового значения (по умолчанию 10), файл сегмента не уплотняется. Пороговое значение можно настроить с помощью параметра конфигурации сервера gp_appendonly_compaction_threshold. VACUUM FULL игнорирует пороговое значение и перезаписывает файл сегмента независимо от отношения. Уплотнение AO-таблиц можно отключить с помощью параметра конфигурации сервера gp_appendonly_compaction. См. Настройка СУБД с помощью GUC для получения информации о параметрах конфигурации сервера.
Если при очистке AO-таблицы обнаруживается параллельная сериализуемая транзакция, текущие и последующие файлы сегментов не уплотняются. Если файл сегмента был уплотнен, но в транзакции, удаляющей исходный файл сегмента, обнаруживается параллельная сериализуемая транзакция, удаление пропускается. Это может привести к тому, что один или два файла сегментов останутся в состоянии "ожидание удаления" после завершения уплотнения.
Примеры
Очистка одной таблицы onek, проведение ее анализа для оптимизатора и вывод подробного отчета о процессе операции очистки:
VACUUM (VERBOSE, ANALYZE) onek;
Очистка всех таблиц в текущей базе данных:
VACUUM;
Очистка отдельной таблицы:
VACUUM (VERBOSE, ANALYZE) mytable;
Очистка всех таблиц в текущей базе данных и сбор статистики для оптимизатора запросов:
VACUUM ANALYZE;
Совместимость
Оператор VACUUM отсутствует в стандарте SQL.