VACUUM

VACUUM — почистить память и при необходимости проанализировать базу данных

Синтаксис

VACUUM [ ( параметр [, ...] ) ] [ таблица_и_столбцы [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ таблица_и_столбцы [, ...] ]

Где параметр может быть следующим:

    FULL [ логическое_значение ]
    FREEZE [ логическое_значение ]
    VERBOSE [ логическое_значение ]
    ANALYZE [ логическое_значение ]
    DISABLE_PAGE_SKIPPING [ логическое_значение ]
    SKIP_LOCKED [ логическое_значение ]
    INDEX_CLEANUP [ логическое_значение ]
    TRUNCATE [ логическое_значение ]
    PARALLEL целое_число

Где таблица_и_столбцы это:

    имя_таблицы [ ( имя_столбца [, ...] ) ]

Описание

Команда VACUUM освобождает пространство, занятое «мертвыми» кортежами. В обычной работе QHB удаленные или устаревшие из-за обновления кортежи физически не удаляются из своей таблицы, а остаются в ней до тех пор, пока не будет вызвана команда VACUUM. Поэтому VACUUM нужно периодически запускать, особенно на часто обновляемых таблицах.

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

VACUUM ANALYZE выполняет VACUUM (очистку), а затем ANALYZE (анализ) для каждой выбранной таблицы. Это удобная комбинированная форма для сценариев регламентного обслуживания. Дополнительную информацию о его обработке см. в разделе ANALYZE.

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

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

Параметры

FULL

Выбирает «полную» очистку, которая может освободить больше места, но занимает гораздо больше времени и исключительно блокирует таблицы. Этот метод также требует дополнительного дискового пространства, так как он записывает новую копию таблицы и не освобождает старую копию до завершения операции. Обычно это следует использовать только тогда, когда требуется освободить значительное пространство внутри таблицы.

FREEZE

Выбирает агрессивное «замораживание» кортежей. Указание FREEZE эквивалентно выполнению VACUUM с параметрами vacuum_freeze_min_age и vacuum_freeze_table_age, установленными в ноль. Агрессивное замораживание всегда выполняется при перезаписи таблицы, поэтому при указании FULL этот параметр избыточен.

VERBOSE

Печатает подробный отчет о процедуре очистки для каждой таблицы.

ANALYZE

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

DISABLE_PAGE_SKIPPING

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

SKIP_LOCKED

Указывает, что при начале работы над таблицей VACUUM не должен ждать освобождения конфликтующих блокировок: если таблицу нельзя немедленно заблокировать без ожидания, она пропускается. Обратите внимание, что даже при использовании этого параметра VACUUM по-прежнему может блокироваться при открытии индексов. Также VACUUM ANALYZE может блокироваться при получении выборочных строк из партиций, дочерних элементов наследования таблиц и некоторых типов сторонних таблиц. Кроме того, хотя обычно VACUUM обрабатывает все партиции указанных партиционированных таблиц, этот параметр позволит VACUUM пропустить их, если на партиционированной таблице имеется конфликтующая блокировка.

INDEX_CLEANUP

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

TRUNCATE

Указывает, что VACUUM должен попытаться обрезать любые пустые страницы в конце таблицы и освободить дисковое пространство для усеченных страниц, которые будут возвращены в операционную систему. Обычно это желаемое поведение и значение по умолчанию, если только параметр vacuum_truncate подлежащей очистке таблицы не был установлен в значение false. Установка этого параметра в false может быть полезна, чтобы избежать блокировки ACCESS EXCLUSIVE таблицы, которая требуется для усечения. Этот параметр игнорируется при использовании FULL.

PARALLEL

Осуществляет фазы очистки и уборки индексов при параллельном выполнении VACUUM, используя целое_число фоновых рабочих процессов (подробную информацию о каждой фазе очистки см. в таблице Фазы VACUUM). Число рабочих процессов, используемых для этой операции, равно числу индексов в отношении, подходящих для параллельной очистки. Это число ограничено числом рабочих процессов, заданных с помощью параметра PARALLEL (если он указан), которые дополнительно ограничены параметром max_parallel_maintenance_workers. Индекс может обрабатываться в режиме параллельной очистки только в том случае, если размер этого индекса больше указанного в параметре min_parallel_index_scan_size. Пожалуйста, учтите, что это не гарантирует, что при выполнении данной операции будет задействовано столько параллельных рабочих процессов, сколько задано параметром целое_число. Вполне возможно, что в процессе очистки рабочие процессы будут использоваться в меньшем количестве или не будут использоваться вовсе. На обработку каждого индекса может быть задействован только один рабочий процесс, поэтому параллельные рабочие процессы запускаются, только если в таблице имеется как минимум 2 индекса. Рабочие процессы очистки запускаются до начала каждой фазы и завершаются после ее окончания. В будущих релизах это поведение может измениться. Данный параметр нельзя использовать вместе с FULL.

логическое_значение

Указывает, должен ли выбранный параметр быть включен или выключен. Можно написать TRUE, ON или 1, чтобы включить этот параметр, и FALSE, OFF или 0, чтобы выключить. логическое_значение может быть опущено, в этом случае предполагается TRUE.

целое_число

Указывает неотрицательное целое значение, передаваемое выбранному параметру.

имя_таблицы

Имя конкретной таблицы или материализованного представления, подлежащего очистке (может быть дополнено схемой). Если указанная таблица является партиционированной, все ее конечные партиции также очищаются.

имя_столбца

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

Вывод на консоль

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

Примечания

Чтобы очистить таблицу, обычно нужно быть ее владельцем или суперпользователем. Однако владельцам баз данных разрешено очищать все таблицы в своих базах данных, за исключением общих каталогов. (Ограничение для общих каталогов означает, что истинную очистку всей базы данных может выполнить только суперпользователь.) VACUUM будет пропускать все таблицы, которые вызывающий пользователь не имеет права очищать.

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

Для таблиц с индексами GIN VACUUM (в любой форме) также завершает все отложенные добавления индекса, перемещая отложенные записи индекса в соответствующие места в основной структуре индекса GIN. Дополнительную информацию см. в разделе Быстрое обновление GIN.

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

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

Параметр PARALLEL используется только в целях очистки. Если этот параметр указан вместе с ANALYZE, на работу ANALYZE он не влияет.

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

QHB включает в себя установку «autovacuum» (автоочистка), которая может автоматизировать регулярную очистку. Дополнительную информацию об автоматической и ручной очистке см. в разделе Регулярная очистка.

Примеры

Очистить одну таблицу onek, проанализировать ее для оптимизатора и распечатать подробный отчет о вакуумной активности:

VACUUM (VERBOSE, ANALYZE) onek;

Совместимость

В стандарте SQL нет команды VACUUM.

См. также

vacuumdb, Определение предела стоимости работы процесса очистки, Процесс «Автовакуум»