VACUUM

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


Синтаксис

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

где параметром может быть:

    FULL [ логическое_значение ]
    FREEZE [ логическое_значение ]
    VERBOSE [ логическое_значение ]
    ANALYZE [ логическое_значение ]
    DISABLE_PAGE_SKIPPING [ логическое_значение ]
    SKIP_LOCKED [ логическое_значение ]
    INDEX_CLEANUP { AUTO | ON | OFF }
    PROCESS_TOAST [ логическое_значение ]
    TRUNCATE [ логическое_значение ]
    PARALLEL целое_число

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

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

Описание

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

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

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

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

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


Параметры

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 обрабатывать индексы, содержащие один и более неиспользуемых кортежей. При значении AUTO (по умолчанию) VACUUM может пропускать очистку индексов, когда это применимо. Если INDEX_CLEANUP установлен в значение ON, VACUUM будет консервативно удалять из индексов все неиспользуемые кортежи. Это может быть полезно для обратной совместимости с предыдущими версиями QHB, где это было стандартным поведением.

Кроме того, INDEX_CLEANUP можно установить в значение OFF, чтобы заставить VACUUM всегда пропускать очистку индексов, даже когда в таблице имеется много неиспользуемых кортежей. Это может быть полезно при необходимости выполнить VACUUM как можно быстрее, чтобы избежать надвигающейся угрозы зацикливания идентификаторов транзакций (см. подраздел Предотвращение ошибок зацикливания идентификаторов транзакций). Однако механизм защиты от этого зацикливания, управляемый параметром vacuum_failsafe_age, обычно срабатывает автоматически, поэтому более предпочтителен. Если очистка индекса не проводится регулярно, может пострадать производительность, поскольку при изменениях таблицы индексы будут накапливать неиспользуемые кортежи, а сама таблица будет накапливать неиспользуемые указатели строк, которые нельзя удалить до завершения очистки индекса.

Этот параметр не действует на таблицы, в которых нет индексов, и игнорируется при использовании параметра FULL. Также он не действует на механизм защиты от зацикливания идентификаторов транзакций. При срабатывании он будет пропускать очистку индексов, даже если в INDEX_CLEANUP установлено ON.

PROCESS_TOAST

Указывает, что VACUUM должна попытаться обработать соответствующую таблицу TOAST для каждого отношения, если таковая существует. Обычно это желаемое поведение, которое установлено по умолчанию. Установка для этого параметра значения false может быть полезно, если нужно очистить только основное отношение. Этот параметр требуется при использовании параметра 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 включает в себя установку процесса «Автовакуум», который может автоматизировать регулярную очистку. Дополнительную информацию об автоматической и ручной очистке см. в разделе Регулярная очистка.

Каждый обслуживающий процесс, запускающий VACUUM без параметра FULL будет записывать ход ее выполнения в представлении pg_stat_progress_vacuum. Обслуживающие процессы, запускающие VACUUM FULL будут записывать ход ее выполнения в представлении pg_stat_progress_cluster. Подробную информацию см. в подразделах Отчет о ходе выполнения VACUUM и Отчет о ходе выполнения CLUSTER.


Примеры

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

VACUUM (VERBOSE, ANALYZE) onek;

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

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


См. также

vacuumdb, Задержка очистки по стоимости, Процесс «Автовакуум», Отчет о ходе выполнения VACUUM, Отчет о ходе выполнения CLUSTER