[Документация Yandex Cloud](../../index.md) > [Yandex MPP Analytics for PostgreSQL](../index.md) > [Концепции](overview.md) > Очистка таблиц и системного каталога

# Очистка таблиц и системного каталога в Yandex MPP Analytics for PostgreSQL

В Yandex MPP Analytics for PostgreSQL очистка пользовательских таблиц и системного каталога выполняется [автоматически](#autovacuum) в фоновом режиме. Если автоматическая очистка оказывается недостаточной, может потребоваться [самостоятельное проведение очистки](#vacuum-recomendation).

## Очистка таблиц {#tables}

При записи транзакции в базу данных ей присваивается уникальный идентификатор `XID` (32-битный счетчик). По нему база данных определяет, какая транзакция началась раньше, а какая позже, и какие изменения видны текущей транзакции. Когда значение `XID` переполняется, счетчик сбрасывается, и отсчет транзакций начинается снова (механизм wraparound).

При выполнении операций обновления (`UPDATE`) и удаления (`DELETE`) старые версии строк помечаются как «мертвые» (dead tuples), но физически не удаляются из таблицы, чтобы транзакции, которые начались раньше, могли их видеть. В результате таблицы начинают занимать больше места на диске, и запросы к базе данных выполняются медленнее из-за увеличения объема обрабатываемых данных.

Для освобождения пространства, занятого «мертвыми» строками, используются команды `VACUUM` и `VACUUM FULL`. Эти команды также замораживают (frozen) `XID` в строках, созданных завершенными транзакциями. Это необходимо, чтобы строки оставались видимыми, даже если `XID` переполнится и идентификаторы завершенных транзакций будут использоваться для новых транзакций.

По умолчанию в Yandex MPP Analytics for PostgreSQL используются [heap-таблицы](tables.md) — стандартный тип таблиц PostgreSQL. Для них команды `VACUUM` и `VACUUM FULL` работают следующим образом:

* `VACUUM` помечает удаленные и устаревшие строки в таблице и ее индексах как свободное пространство для повторного использования. При этом физический размер таблицы на диске не уменьшается.
* `VACUUM FULL` создает новую таблицу и копирует в нее строки, исключая удаленные и устаревшие, а также создает новые индексы для таблицы. Затем новая таблица заменяет исходную. `VACUUM FULL` уменьшает физический размер таблицы на диске и очищает индексы от устаревших строк. На время выполнения операции требуется блокировка `ACCESS EXCLUSIVE`.

{% note tip %}

`VACUUM FULL` блокирует работу с таблицей и требует дополнительного места на диске для создания временной таблицы, поэтому использовать эту операцию часто не рекомендуется. Чтобы избежать блокировки, можно создать новую таблицу, содержащую актуальные строки, с помощью `CREATE TABLE ... AS`, а затем удалить исходную таблицу.

{% endnote %}

[Подробнее об операции очистки в PostgreSQL](https://www.postgresql.org/docs/18/routine-vacuuming.html).

### Информация о незамороженных XID {#relfrozenxid}

В PostgreSQL информация о незамороженных `XID` хранится в таблицах `pg_class` и `pg_database`:

* Самый старый незамороженный `XID` для каждой таблицы — в столбце `relfrozenxid` таблицы `pg_class`.
* Самый старый незамороженный `XID` для каждой базы данных — в столбце `datfrozenxid` таблицы `pg_database`.

Показатели обновляются после выполнения `VACUUM` или `VACUUM FULL`.

[Подробнее о wraparound в PostgreSQL](https://www.postgresql.org/docs/18/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND).

### Очистка таблиц AO и AOCO {#ao-tables}

[Таблицы AO и AOCO](tables.md) — таблицы, оптимизированные для добавления. Данные в них хранятся в сегментных файлах, которые состоят из блоков. Новые строки добавляются в конец сегментных файлов, а старые помечаются как «мертвые» и не переписываются.

Для таблиц AO и AOCO команды `VACUUM` и `VACUUM FULL` работают следующим образом:

* `VACUUM` создает новый файл для каждого сегмента и переносит в него видимые строки. При этом количество блоков на диске не меняется. На время удаления старого файла и активации нового таблица блокируется.
* `VACUUM FULL` создает новый файл для каждого сегмента и переносит в него видимые строки, перераспределяя их между блоками. Это приводит к уменьшению количества блоков на диске. На время выполнения операции таблица блокируется.

[Подробнее об операции очистки для таблиц AO и AOCO](https://techdocs.broadcom.com/us/en/vmware-tanzu/data-solutions/tanzu-greenplum/7/greenplum-database/ref_guide-sql_commands-VACUUM.html).

### Очистка таблиц Yezzey {#yezzey}

[Yezzey](../operations/extensions/yezzey.md) — это расширение для кластера Yandex MPP Analytics for PostgreSQL, которое позволяет хранить таблицы AO и AOCO в [гибридном хранилище](hybrid-storage.md).

Для таблиц AO и AOCO в гибридном хранилище операции `VACUUM` и `VACUUM FULL` выполняются так же, как и для подобных таблиц в хранилище кластера.

## Очистка системного каталога {#catalog}

Системный каталог в Yandex MPP Analytics for PostgreSQL — это набор системных таблиц в схеме `pg_catalog`. Системные таблицы хранят метаданные о таблицах, столбцах и других объектах базы данных. Со временем они раздуваются из-за создания и удаления DDL-объектов, особенно при массовой загрузке данных (например, с помощью [Managed Service for Apache Airflow™](../../managed-airflow/index.md)). Поэтому для системного каталога также необходимо выполнять операции `VACUUM` и `VACUUM FULL`.

При выполнении `VACUUM FULL` системного каталога рекомендуется переводить базу данных в режим ограниченного доступа, например, запретив подключения с помощью [правил аутентификации пользователей](../operations/user-auth-rules.md), чтобы исключить взаимодействие пользователей с каталогом. После завершения очистки базу переводят в обычный режим.

{% note warning %}

Прерывание операции `VACUUM FULL` может повредить каталог на сегменте.

{% endnote %}

## Мониторинг состояния таблиц и индексов {#monitoring}

Получить информацию о статистике bloat системного каталога и статистике очистки пользовательских таблиц можно в [консоли управления](https://kz.console.yandex.cloud) на вкладке **Мониторинг** страницы управления кластером или в сервисе [Yandex Monitoring](../../monitoring/concepts/index.md), на графиках в блоке **Background activities**.

[Подробнее о мониторинге состояния кластера Yandex MPP Analytics for PostgreSQL](../operations/monitoring.md#monitoring-cluster).

## Автоматическая очистка {#autovacuum}

В Yandex MPP Analytics for PostgreSQL очистка (`VACUUM`) пользовательских таблиц и системного каталога выполняется автоматически в фоновом режиме. Однако рекомендуется отслеживать состояние таблиц и индексов с помощью [графиков bloat](../operations/monitoring.md#monitoring-cluster) и выполнять очистку [самостоятельно](#vacuum-recomendation), если автоматическая очистка оказывается недостаточной и таблицы раздуваются.

[Подробнее об автоматической очистке](maintenance.md#custom-table-vacuum).

## Самостоятельное планирование и проведение очистки {#vacuum-recomendation}

Операции `VACUUM` и `VACUUM FULL` для таблиц AO и AOCO, а также `VACUUM FULL` для heap-таблиц требуют эксклюзивной блокировки  таблицы (`ACCESS EXCLUSIVE`). Если в базе данных есть незавершенные транзакции, блокирующие таблицу, возникает конфликт блокировок. Это временно приостанавливает операции с таблицей и с системным каталогом.

Чтобы избежать сбоев, соблюдайте следующие рекомендации:

  * выполняйте очистку отдельных таблиц, а не всей базы данных;
  * подбирайте частоту очистки для каждой таблицы;
  * ограничивайте время очистки;
  * контролируйте активные соединения и не допускайте зависших транзакций.