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