Перейти к основному содержимому

VACUUM

примечание

Эта страница переведена при помощи нейросети GigaChat.

VACUUM – сбор мусора и, при необходимости, анализ базы данных.

Синтаксис

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]

where option can be one of:

FULL [ boolean ]
FREEZE [ boolean ]
VERBOSE [ boolean ]
ANALYZE [ boolean ]
DISABLE_PAGE_SKIPPING [ boolean ]
SKIP_LOCKED [ boolean ]
INDEX_CLEANUP { AUTO | ON | OFF }
PROCESS_MAIN [ boolean ]
PROCESS_TOAST [ boolean ]
TRUNCATE [ boolean ]
PARALLEL integer
SKIP_DATABASE_STATS [ boolean ]
ONLY_DATABASE_STATS [ boolean ]
BUFFER_USAGE_LIMIT size

and table_and_columns is:

table_name [ ( column_name [, ...] ) ]

Описание

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

Без списка table_and_columns 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 будет консервативно удалять все мертвые кортежи из индексов. Это может быть полезно для обеспечения обратной совместимости с предыдущими выпусками PostgreSQL, где это было стандартной практикой.

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

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

PROCESS_MAIN
Определяет, должна ли команда VACUUM пытаться обработать основное отношение. Обычно это желаемое поведение и является значением по умолчанию. Установка данного параметра в значение false может быть полезна, когда необходимо очистить только соответствующую таблицу TOAST для указанного отношения.
PROCESS_TOAST
Указывает, что VACUUM должен попытаться обработать соответствующую TOAST таблицу для каждой связи, если она существует. Это обычно желаемое поведение и является настройкой по умолчанию. Установка этого параметра в значение false может быть полезной при необходимости только очистить основную связь. Этот параметр требуется при использовании параметра FULL.
TRUNCATE
Указывает, что VACUUM должен попытаться обрезать любые пустые страницы в конце таблицы и разрешить операционной системе вернуть дисковое пространство для обрезанных страниц. Это обычно ожидаемое поведение и является настройкой по умолчанию, если не установлено значение false для параметра vacuum_truncate для таблицы, которую необходимо очистить. Установка этого параметра в значение false может быть полезна для предотвращения блокировки ACCESS EXCLUSIVE таблицы, необходимой для усечения. Этот параметр игнорируется, если используется FULL.
PARALLEL
Управляет этапами очистки и уборки индексов в ходе параллельного выполнения VACUUM, определяя integer фоновых рабочих процессов (для подробностей каждой фазы вакуума смотрите «Фазы VACUUM»). Количество используемых рабочих процессов равно количеству индексов в отношении, поддерживающих параллельный VACUUM, ограниченное числом, указанным в PARALLEL, если оно указано, и дополнительно ограниченное значением max_parallel_maintenance_workers. Индекс может участвовать в параллельном вакуумировании только тогда, когда размер индекса превышает min_parallel_index_scan_size. Обратите внимание, что нет гарантии, что во время выполнения будет использовано указанное в integer количество параллельных рабочих процессов. VACUUM может выполняться с меньшим числом рабочих процессов или вовсе без них. На один индекс может быть использован только один рабочий процесс. Поэтому параллельные процессы запускаются только если в таблице как минимум два индекса. Рабочие процессы запускаются перед началом каждого этапа и завершаются по его завершении. Эти правила могут измениться в будущих версиях. Эта опция не может использоваться с FULL.
SKIP_DATABASE_STATS
Задает, что VACUUM должна пропускать обновление глобальных статистических данных о самых старых неразмороженных XIDах. Обычно VACUUM обновляет эти статистики один раз в конце команды. Однако это может занять некоторое время в базе данных с большим количеством таблиц, и ничего полезного не произойдет, если таблица, содержащая самый старый неразмороженный XID, не была среди очищаемых. Более того, если одновременно запущено несколько команд VACUUM, обновить глобальные статистики одновременно сможет только одна из них. Следовательно, если приложение намерено выполнить серию многих команд VACUUM, полезно задать этот параметр во всех таких командах, кроме последней, или задать его во всех командах и отдельно запустить команду VACUUM (ONLY_DATABASE_STATS) позже.
ONLY_DATABASE_STATS
Задает, что VACUUM должна делать ничего, кроме обновления глобальных статистических данных о самых старых неразмороженных XIDах. Когда этот параметр указан, список table_and_columns должен быть пустым, и никакие другие параметры не должны быть включены, кроме VERBOSE.
BUFFER_USAGE_LIMIT
Задает размер кольцевого буфера стратегии доступа к буферу для VACUUM. Этот размер используется для расчета числа общих буферов, которые будут повторно использованы в рамках данной стратегии. 0 отключает использование Buffer Access Strategy. Если также указан ANALYZE, значение BUFFER_USAGE_LIMIT применяется как для стадии очистки, так и для анализа. Этот параметр не может быть использован совместно с параметром FULL, за исключением случая, когда также указан ANALYZE. Когда этот параметр не указан, VACUUM использует значение из vacuum_buffer_usage_limit. Большее значение может позволить VACUUM работать быстрее, однако слишком большое значение может привести к вытеснению из общих буферов слишком большого количества других полезных страниц. Минимальное значение составляет 128 kB, максимальное — 16 GB.
boolean
Указывает, следует ли включить или отключить выбранный параметр. Напишите TRUE, ON, или 1 для включения параметра и FALSE, OFF, или 0 для ее отключения. Значение boolean также может быть опущено, в этом случае предполагается значение TRUE.
integer
Задает неотрицательное целое число, передаваемое выбранному параметру.
size
Задает объем памяти в килобайтах. Размеры также могут быть указаны в виде строки, содержащей числовой размер, за которым следует любая из следующих единиц измерения памяти: B (байты), kB (килобайты), MB (мегабайты), GB (гигабайты) или TB (терабайты).
table_name
Имя конкретной таблицы или материализованного представления, при необходимости дополненное схемой, которое нужно очистить. Если указанная таблица является партиционированной, то все ее конечные секции очищаются.
column_name
Имя столбца, подлежащего анализу. По умолчанию все столбцы. Если указан список столбцов, ANALYZE также должен быть указан.

Выводимая информация

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

Примечания

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

Во время работы VACUUM путь поиска search_path временно изменяется на pg_catalog, pg_temp.

Для таблиц с индексами типа GIN, VACUUM (в любой форме) также завершает все отложенные вставки в индекс, перемещая их в соответствующие позиции основной структуры GIN-индекса. Подробнее смотрите в разделе «Техника быстрого обновления GIN».

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

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

Параметр PARALLEL используется только для целей VACUUM. Если он указана совместно с параметром ANALYZE, на ANALYZE он не влияет.

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

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

Примеры

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

VACUUM (VERBOSE, ANALYZE) onek;

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

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

Следующий синтаксис использовался до версии PostgreSQL 9.0 и все еще поддерживается:

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

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

Смотрите также

vacuumdb, «Отложенная очистка на основе затрат», «Служба Autovacuum», «Отчет о ходе выполнения VACUUM», «Отчет о ходе выполнения CLUSTER