VACUUM#
VACUUM
VACUUM — сборка мусора и опциональный анализ базы данных
Синтаксис
VACUUM [ (option
[, ...] ) ] [table_and_columns
[, ...] ] VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [table_and_columns
[, ...] ] whereoption
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
] PARALLELinteger
SKIP_DATABASE_STATS [boolean
] ONLY_DATABASE_STATS [boolean
] BUFFER_USAGE_LIMITsize
andtable_and_columns
is:table_name
[ (column_name
[, ...] ) ]
Описание
VACUUM
освобождает пространство, занимаемое мертвыми кортежами.
В нормальной работе Tantor SE кортежи, которые
были удалены или устарели после обновления, физически не удаляются из
своей таблицы; они остаются присутствующими до выполнения VACUUM
.
Поэтому необходимо периодически выполнять VACUUM
,
особенно для часто обновляемых таблиц.
Без списка table_and_columns
,
команда VACUUM
обрабатывает каждую таблицу и материализованное представление
в текущей базе данных, на которые у текущего пользователя есть разрешение на очистку.
Список позволяет команде VACUUM
обрабатывать только указанные таблицы.
VACUUM ANALYZE
выполняет команду VACUUM
,
а затем команду ANALYZE
для каждой выбранной таблицы. Это удобная комбинированная форма для регулярных сценариев обслуживания. См. ANALYZE для получения дополнительной информации о ее обработке.
Простая команда VACUUM
(без FULL
) просто восстанавливает
пространство и делает его
доступным для повторного использования. Эта форма команды может работать параллельно
с обычным чтением и записью таблицы, так как исключающая блокировка
не получается. Однако, дополнительное пространство не возвращается операционной
системе (в большинстве случаев); оно просто остается доступным для повторного использования в
той же таблице. Она также позволяет использовать несколько ЦП для обработки
индексов. Эта функция известна как параллельный VACUUM.
Чтобы отключить эту функцию, можно использовать параметр PARALLEL
и
указать количество параллельных рабочих процессов как ноль. VACUUM FULL
перезаписывает
все содержимое таблицы в новый файл на диске без дополнительного пространства,
позволяя возвращать неиспользуемое пространство операционной системе. Эта форма
намного медленнее и требует блокировки ACCESS EXCLUSIVE
для
каждой таблицы во время обработки.
Когда список опций заключен в скобки, опции могут быть записаны в любом порядке. Без скобок опции должны быть указаны в точно таком же порядке, как показано выше. Синтаксис со скобками был добавлен в Tantor SE9.0; синтаксис без скобок устарел.
Параметры
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, где это было стандартным поведением.INDEX_CLEANUP
также может быть установлен вOFF
, чтобы принудительно заставитьVACUUM
всегда пропускать очистку индексов, даже если в таблице есть много мертвых кортежей. Это может быть полезно, когда необходимо выполнитьVACUUM
как можно быстрее, чтобы избежать неминуемого зацикливания идентификаторов транзакций (см. Раздел 24.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
фоновых рабочих процессов (для получения более подробной информации каждой фазы очистки обратитесь к Таблица 27.45). Количество рабочих процессов, используемых для выполнения операции, равно количеству индексов на отношение, которые поддерживают параллельную очистку, что ограничено количеством рабочих процессов, указанных с помощью параметра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
выводит сообщения о ходе выполнения, указывающие, какая таблица в данный момент обрабатывается. Также выводятся различные статистические данные о таблицах.
Примечания
Для очистки таблицы обычно требуется быть владельцем таблицы или суперпользователем. Однако владельцам баз данных разрешено очистить все таблицы в их базах данных, за исключением общих каталогов. (Ограничение для общих каталогов означает, что истинную очистку VACUUM
на уровне всей базы данных может выполняться только суперпользователем). VACUUM
будет пропускать любые таблицы, которые вызывающий пользователь не имеет права очистить.
VACUUM
не может быть выполнена внутри блока транзакции.
Для таблиц с индексами GIN, VACUUM
(в любой форме) также завершает все ожидающие вставки индексов, перемещая ожидающие записи индексов в соответствующие места в основной структуре индекса GIN. См. Раздел 68.4.1 для получения подробной информации.
Мы рекомендуем регулярно выполнять очистку всех баз данных для удаления мертвых строк. Tantor SE включает средство “автоочистки”, которое может автоматизировать процедурное обслуживание очистки. Дополнительную информацию об автоматической и ручной очистке см. в разделе Раздел 24.1.
Опция FULL
не рекомендуется для регулярного использования, но может быть полезна в особых случаях. Примером может быть ситуация, когда вы удалили или обновили большую часть строк в таблице и хотите, чтобы таблица физически уменьшилась, занимая меньше места на диске и позволяя более быстрые сканирования таблицы. Команда VACUUM FULL
обычно уменьшает таблицу больше, чем простая команда VACUUM
.
Опция PARALLEL
используется только для целей очистки.
Если эта опция указана с опцией ANALYZE
,
она не влияет на ANALYZE
.
VACUUM
вызывает значительный увеличение трафика ввода-вывода, что может привести к плохой производительности для других активных сессий. Поэтому иногда рекомендуется использовать функцию задержки очистки на основе стоимости. Для параллельной очистки каждый рабочий процесс спит пропорционально проделанной им работы. См. Раздел 19.4.4 для получения подробной информации.
Каждый запущенный бэкенд с командой VACUUM
без
опции FULL
будет отображать свой прогресс в представлении
pg_stat_progress_vacuum
. Бэкенды, выполняющие
команду VACUUM FULL
, вместо этого будут отображать свой прогресс в представлении
pg_stat_progress_cluster
. См. разделы
Раздел 27.4.5 и
Раздел 27.4.2 для получения подробной информации.
Примеры
Чтобы очистить одну таблицу onek
, проанализируйте ее для оптимизатора и выведите подробный отчет о процессах очистки:
VACUUM (VERBOSE, ANALYZE) onek;
Совместимость
В стандарте SQL нет оператора VACUUM
.