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