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