VACUUM#

VACUUM

VACUUM

VACUUM — сборка мусора и опциональный анализ базы данных

Синтаксис

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ 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 освобождает пространство, занимаемое мертвыми кортежами. В нормальной работе 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.