VACUUM#
VACUUM
VACUUM — сборка мусора и опциональный анализ базы данных
Синтаксис
VACUUM [ (option[, ...] ) ] [table_and_columns[, ...] ] whereoptioncan 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] PARALLELintegerSKIP_DATABASE_STATS [boolean] ONLY_DATABASE_STATS [boolean] BUFFER_USAGE_LIMITsizeandtable_and_columnsis:table_name[ (column_name[, ...] ) ]
Описание
VACUUM освобождает пространство, занимаемое мертвыми кортежами.
В нормальной работе Tantor SE-1C кортежи, которые
были удалены или устарели после обновления, физически не удаляются из
своей таблицы; они остаются присутствующими до выполнения VACUUM.
Поэтому необходимо периодически выполнять VACUUM,
особенно для часто обновляемых таблиц.
Без списка table_and_columns,
команда VACUUM обрабатывает каждую таблицу и материализованное представление
в текущей базе данных, на которые у текущего пользователя есть разрешение на очистку.
Список позволяет команде VACUUM обрабатывать только указанные таблицы.
VACUUM ANALYZE выполняет команду VACUUM,
а затем команду ANALYZE для каждой выбранной таблицы. Это удобная комбинированная форма для регулярных сценариев обслуживания. См. ANALYZE для получения дополнительной информации о ее обработке.
Простая команда VACUUM (без FULL) просто восстанавливает
пространство и делает его
доступным для повторного использования. Эта форма команды может работать параллельно
с обычным чтением и записью таблицы, так как исключающая блокировка
не получается. Однако, дополнительное пространство не возвращается операционной
системе (в большинстве случаев); оно просто остается доступным для повторного использования в
той же таблице. Она также позволяет использовать несколько ЦП для обработки
индексов. Эта функция известна как параллельный VACUUM.
Чтобы отключить эту функцию, можно использовать параметр 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будет осторожно удалять все мертвые кортежи из индексов. Это может быть полезно для обратной совместимости с предыдущими версиями Tantor SE-1C, где это было стандартным поведением.INDEX_CLEANUPтакже может быть установлен вOFF, чтобы принудительно заставитьVACUUMвсегда пропускать очистку индексов, даже если в таблице есть много мертвых кортежей. Это может быть полезно, когда необходимо выполнитьVACUUMкак можно быстрее, чтобы избежать неминуемого зацикливания идентификаторов транзакций (см. Раздел 23.1.5). Однако, механизм защиты от переполнения, контролируемый vacuum_failsafe_age, обычно автоматически срабатывает, чтобы избежать сбоя из-за зацикливания идентификаторов транзакций, и этот механизм предпочтительнее. Если очистка индексов не выполняется регулярно, производительность может ухудшиться, потому что при изменении таблицы индексы будут накапливать мертвые кортежи, а сама таблица будет накапливать мертвые указатели строк, которые нельзя удалить до завершения очистки индексов.Этот параметр не влияет на таблицы, не имеющие индексов, и игнорируется, если используется опция
FULL. Он также не влияет на механизм безопасности от зацикливания идентификаторов транзакций. При его срабатывании будет прне указана очистка индексов, даже если установлен параметрINDEX_CLEANUPв значениеON.PROCESS_MAINУказывает, что
VACUUMдолжен попытаться обработать основную таблицу. Это обычно желаемое поведение и оно задается по умолчанию. Установка этого параметра в false может быть полезной, когда необходимо выполнить очистку только соответствующей таблицыTOAST.PROCESS_TOASTУказывает, что
VACUUMдолжен попытаться обработать соответствующую таблицуTOASTдля каждого отношения, если она существует. Это рекомендуемое поведение и оно задается по умолчанию. Установка этой опции в значение false может быть полезной, когда необходимо только очистить основное отношение. Эта опция обязательна при использовании опцииFULL.TRUNCATEУказывает, что
VACUUMдолжен попытаться обрезать все пустые страницы в конце таблицы и вернуть дисковое пространство для обрезанных страниц операционной системе. Это обычно желаемое поведение и задается по умолчанию, если для очистки таблицы не установлен параметрvacuum_truncateв значение false. Установка этого параметра в значение false может быть полезной для избегания блокировкиACCESS EXCLUSIVEна таблицу, которая требуется для обрезки. Этот параметр игнорируется, если используется параметрFULL.PARALLELВыполняйте фазы очистки индекса и очистки индекса команды
VACUUMпараллельно, используяintegerфоновых рабочих процессов (для получения более подробной информации каждой фазы очистки обратитесь к Таблица 26.46). Количество рабочих процессов, используемых для выполнения операции, равно количеству индексов на отношение, которые поддерживают параллельную очистку, что ограничено количеством рабочих процессов, указанных с помощью параметраPARALLEL, если таковые имеются, что дополнительно ограничено max_parallel_maintenance_workers. Индекс может участвовать в параллельной очистке только в том случае, если размер индекса превышает min_parallel_index_scan_size. Обратите внимание, что не гарантируется, что количество параллельных рабочих процессов, указанных вinteger, будет использоваться во время выполнения. Возможно, что очистка будет выполняться с меньшим количеством рабочих процессов, чем указано, или даже без рабочих процессов вообще. На каждый индекс может быть использован только один рабочий процесс. Поэтому параллельные рабочие процессы запускаются только тогда, когда в таблице есть как минимум2индекса. Рабочие процессы для очистки запускаются перед началом каждой фазы и завершаются в конце фазы. Эти поведения могут измениться в будущих версиях. Этот параметр не может использоваться с параметром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используется как для этапа vacuum, так и для этапа analyze. Эта опция не может быть использована с опцией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.
VACUUM не может быть выполнена внутри блока транзакции.
Для таблиц с индексами GIN, VACUUM (в любой форме) также завершает все ожидающие вставки индексов, перемещая ожидающие записи индексов в соответствующие места в основной структуре индекса GIN. См. Раздел 62.4.4.1 для получения подробной информации.
Мы рекомендуем регулярно выполнять очистку всех баз данных для удаления мертвых строк. Tantor SE-1C включает средство “автоочистки”, которое может автоматизировать процедурное обслуживание очистки. Дополнительную информацию об автоматической и ручной очистке см. в разделе Раздел 23.1.
Опция FULL не рекомендуется для регулярного использования, но может быть полезна в особых случаях. Примером может быть ситуация, когда вы удалили или обновили большую часть строк в таблице и хотите, чтобы таблица физически уменьшилась, занимая меньше места на диске и позволяя более быстрые сканирования таблицы. Команда VACUUM FULL обычно уменьшает таблицу больше, чем простая команда VACUUM.
Опция PARALLEL используется только для целей очистки.
Если эта опция указана с опцией ANALYZE,
она не влияет на ANALYZE.
VACUUM вызывает значительный увеличение трафика ввода-вывода, что может привести к плохой производительности для других активных сессий. Поэтому иногда рекомендуется использовать функцию задержки очистки на основе стоимости. Для параллельной очистки рабочий процесс засыпает на время, пропорциональное объему выполненной им работы. См. Раздел 18.4.5 для получения подробной информации.
Каждый запущенный бэкенд с командой VACUUM без
опции FULL будет отображать свой прогресс в представлении
pg_stat_progress_vacuum. Бэкенды, выполняющие
команду VACUUM FULL, вместо этого будут отображать свой прогресс в представлении
pg_stat_progress_cluster. См. разделы
Раздел 26.4.5 и
Раздел 26.4.2 для получения подробной информации.
Примеры
Чтобы очистить одну таблицу onek, проанализируйте ее для оптимизатора и выведите подробный отчет о процессах очистки:
VACUUM (VERBOSE, ANALYZE) onek;
Совместимость
В стандарте SQL нет оператора VACUUM.
Следующий синтаксис использовался до версии PostgreSQL 9.0 и до сих пор поддерживается:
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
Обратите внимание, что в этом синтаксисе параметры должны быть указаны в точном порядке, показанном.