VACUUM
VACUUM — убрать мусор и при необходимости проанализировать базу данных
Синтаксис
VACUUM [ ( параметр [, ...] ) ] [ таблица_и_столбцы [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ таблица_и_столбцы [, ...] ]
где параметром может быть:
FULL [ логическое_значение ]
FREEZE [ логическое_значение ]
VERBOSE [ логическое_значение ]
ANALYZE [ логическое_значение ]
DISABLE_PAGE_SKIPPING [ логическое_значение ]
SKIP_LOCKED [ логическое_значение ]
INDEX_CLEANUP { AUTO | ON | OFF }
PROCESS_MAIN [ логическое_значение ]
PROCESS_TOAST [ логическое_значение ]
TRUNCATE [ логическое_значение ]
PARALLEL целое_число
SKIP_DATABASE_STATS [ логическое_значение ]
ONLY_DATABASE_STATS [ логическое_значение ]
BUFFER_USAGE_LIMIT размер
и таблицей_и_столбцами является:
имя_таблицы [ ( имя_столбца [, ...] ) ]
Описание
Команда VACUUM освобождает память, занятую нерабочими кортежами. В обычной
работе QHB удаленные или устаревшие из-за обновления кортежи
физически не удаляются из своей таблицы, а остаются в ней до тех пор, пока не
будет проведена операция VACUUM. Поэтому VACUUM нужно периодически запускать,
особенно в часто обновляемых таблицах.
Без списка таблица_и_столбцы команда VACUUM обрабатывает каждую таблицу
и материализованное представление в текущей базе данных, на очистку которых
текущий пользователь имеет разрешение. При наличии списка 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 будет консервативно
удалять из индексов все нерабочие кортежи. Это может быть полезно для обратной
совместимости с предыдущими версиями QHB, где это было стандартным
поведением.
Кроме того, INDEX_CLEANUP можно установить в значение OFF, чтобы заставить
VACUUM всегда пропускать очистку индексов, даже когда в таблице имеется
много нерабочих кортежей. Это может быть полезно при необходимости выполнить
VACUUM как можно быстрее, чтобы избежать надвигающейся угрозы зацикливания
идентификаторов транзакций (см. подраздел Предотвращение ошибок зацикливания идентификаторов транзакций).
Однако механизм защиты от этого зацикливания, управляемый параметром
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, используя
целое_число фоновых рабочих процессов (подробную информацию о каждой фазе
очистки см. в таблице Фазы VACUUM). Количество рабочих процессов, используемых
для этой операции, равно количеству индексов в отношении, поддерживающих
параллельную очистку. Количество индексов ограничено количеством рабочих процессов,
заданных параметром PARALLEL (если они указаны), которое дополнительно
ограничено параметром max_parallel_maintenance_workers. Индекс может
участвовать в параллельной очистки только в том случае, если его размер больше,
чем min_parallel_index_scan_size. Пожалуйста, учтите, что это не гарантирует,
что при выполнении данной операции будет задействовано ровно столько параллельных
рабочих процессов, сколько задано целым_числом. Вполне возможно, что в
процессе очистки рабочие процессы будут использоваться в меньшем количестве или
не будут использоваться вовсе. Каждый индекс может обрабатываться только одним
рабочим процессом, поэтому параллельные рабочие процессы запускаются, только если
в таблице имеется как минимум 2 индекса. Рабочие процессы очистки запускаются до
начала каждой фазы и завершаются после ее окончания. В будущих релизах это
поведение может измениться. Данный параметр нельзя использовать вместе с
параметром FULL.
SKIP_DATABASE_STATS
Указывает, что VACUUM должна пропускать обновление статистики о самых старых
незамороженных XID в пределах базы данных. Обычно VACUUM обновляет эту статистику
один раз в конце своего выполнения. Однако в базе данных с очень большим
количеством таблиц это может занять некоторое время и ни к чему не приведет, если
среди очищенных таблиц не было содержащих самые старые незамороженные XID. Более
того, если параллельно запущено несколько команд VACUUM, за раз обновить
статистику может только одна из них. Таким образом, если приложение намерено
запустить серию из множества команд VACUUM, может быть полезно установить этот
параметр для всех команд, кроме последней, или установить его для всех команд и
после их выполнения отдельно запустить VACUUM (ONLY_DATABASE_STATS).
ONLY_DATABASE_STATS
Указывает, что VACUUM не должна делать ничего, кроме обновления статистики по
самым старым незамороженным XID в пределах базы данных. Если этот параметр задан,
список таблица_и_столбцы должен быть пустым, а из других параметров может
быть включен только VERBOSE.
BUFFER_USAGE_LIMIT
Задает для VACUUM размер кольцевого буфера стратегии доступа к буферу. Этот
размер используется для вычисления количества разделяемых буферов, которые будут
повторно использованы как часть этой стратегии. При значении 0 использование
стратегии доступа к буферу выключается. Если также установлен параметр
ANALYZE, значение BUFFER_USAGE_LIMIT используется как на этапе очистки,
так и на этапе анализа. Этот параметр можно использовать с параметром FULL,
только если указан параметр ANALYZE. Если этот параметр не задан, VACUUM
использует значение из vacuum_buffer_usage_limit. Более высокие значения
могут позволить VACUUM выполняться быстрее, но слишком большое значение может
привести к вытеснение из разделяемых буферов многих других полезных страниц.
Минимальное значение — 128 kB, а максимальное — 16 GB.
логическое_значение
Указывает, должен ли выбранный параметр быть включен или выключен. Для включения этого параметра можно написать TRUE, ON или 1, а для выключения — FALSE, OFF или 0. Также логическое_значение можно опустить, и в этом случае предполагается TRUE.
целое_число
Задает неотрицательное целое значение, передаваемое выбранному параметру.
размер
Задает объем памяти в килобайтах. Размеры можно также указать в виде строки, содержащей числовой размер, за которым идет одна из следующих единиц информации: B (байты), kB (килобайты), MB (мегабайты), GB (гигабайты) или TB (терабайты).
имя_таблицы
Имя (может быть дополнено схемой) конкретной таблицы или материализованного представления, подлежащих очистке. Если указанная таблица является партиционированной, все ее листовые партиции тоже очищаются.
имя_столбца
Имя конкретного столбца для анализа. По умолчанию производится анализ всех
столбцов. Если указан список столбцов, также должно быть указано ANALYZE.
Выводимая информация
Когда указывается VERBOSE, команда VACUUM выдает статусные сообщения о том,
какая таблица обрабатывается в настоящее время. Также выводятся различные
статистические данные о таблицах.
Примечания
Чтобы очистить таблицу, обычно нужно быть ее владельцем или суперпользователем.
Однако владельцам баз данных разрешено очищать все таблицы в своих базах данных,
за исключением разделяемых каталогов. (Ограничение для разделяемых каталогов
означает, что настоящую очистку всей базы данных может выполнить только
суперпользователь.) VACUUM будет пропускать все таблицы, которые вызывающий ее
пользователь не имеет права очищать.
Команду VACUUM нельзя выполнить внутри блока транзакции.
Для таблиц с индексами GIN VACUUM (в любой форме) также завершает все отложенные
добавления индекса, перемещая отложенные записи индекса в соответствующие места
в основной структуре индекса GIN. Подробную информацию см. в подразделе
Методика быстрого обновления GIN.
Для удаления нерабочих строк рекомендуется регулярно очищать все базы данных. В QHB имеется средство «автоочистки», которое способно автоматизировать процедуру регулярной очистки. Дополнительную информацию об автоматической и ручной очистке см. в разделе Регулярная очистка.
Параметр FULL не рекомендуется для рутинного использования, но может быть
полезен в особых случаях. Например, если вы удалили или изменили большинство строк
в таблице и хотели бы, чтобы таблица физически уменьшилась, стала занимать меньше
места на диске и позволила проводить более быстрое сканирование таблицы. Обычно
VACUUM FULL сжимает таблицу более эффективно, чем простая команда VACUUM.
Параметр PARALLEL используется только в целях очистки. Если этот параметр
указан вместе с параметром ANALYZE, на работу ANALYZE он не влияет.
Команда VACUUM вызывает значительное увеличение трафика ввода/вывода, что может
привести к низкой производительности для других активных сеансов. Поэтому иногда
рекомендуется использовать функцию задержки очистки по стоимости. При
параллельной очистке каждый рабочий процесс переходит в спящий режим на время,
пропорциональное объему произведенной им работы. Подробную информацию см. в
подразделе Задержка очистки по стоимости.
Каждый обслуживающий процесс, запускающий VACUUM без параметра FULL, будет
записывать ход ее выполнения в представлении pg_stat_progress_vacuum.
Обслуживающие процессы, запускающие команду VACUUM FULL, будут записывать ход
ее выполнения в представлении pg_stat_progress_cluster. Подробную
информацию см. в подразделах Отчет о ходе выполнения VACUUM и
Отчет о ходе выполнения CLUSTER.
Примеры
Очистка единственной таблицы onek, анализ ее для оптимизатора и выведение подробного отчета об операции очистки:
VACUUM (VERBOSE, ANALYZE) onek;
Совместимость
В стандарте SQL нет команды VACUUM.
См. также
vacuumdb, подразделы Задержка очистки по стоимости, Процесс «Автовакуум», Отчет о ходе выполнения VACUUM, Отчет о ходе выполнения CLUSTER