Регулярная очистка

В этом документе объясняется, как правильно и эффективно выполнять периодическую очистку и обслуживание таблиц в базах данных YMatrix, а также приводятся соответствующие принципы.

1 Что такое очистка и обслуживание таблиц в YMatrix?

YMatrix настоятельно рекомендует выполнять регулярную очистку и обслуживание таблиц на продуктивных системах.

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

В большинстве случаев достаточно полагаться на демон autovacuum для выполнения очистки. Для оптимальной производительности может потребоваться настройка параметров autovacuum, описанных ниже. Однако в некоторых сценариях может потребоваться ручное выполнение команд, таких как VACUUM, для дополнения или замены фоновых процессов. Обычно это делается с помощью cron-скриптов или скриптов планировщика задач.

2 Зачем выполнять регулярную очистку и обслуживание?

Регулярная очистка и обслуживание всех таблиц в базе данных YMatrix необходимы по следующим причинам:

  • Освобождение дискового пространства, занимаемого обновлёнными или удалёнными строками. В YMatrix операция UPDATE или DELETE не удаляет старую версию строки немедленно. Это поведение требуется для многоверсионного управления параллелизмом (MVCC): старые версии должны сохраняться до тех пор, пока они могут быть видны другим транзакциям. В конечном счёте, однако, ни одна транзакция не будет требовать устаревшую или удалённую версию строки. Пространство, которое она занимает, должно быть освобождено для повторного использования новыми строками, чтобы предотвратить неограниченный рост использования дискового пространства.
  • Обновление статистики оптимизатора, используемой планировщиком запросов.
  • Обновление карты видимости, что позволяет ускорить сканирование только по индексу.
  • Защита от потери данных из-за переполнения идентификаторов транзакций или мультитранзакций.

3 Как выполнить эффективную очистку и обслуживание?

3.1 Ручная очистка

Ручная очистка выполняется путём запуска SQL-команды VACUUM.

Например, для очистки конкретной таблицы:

=# VACUUM <tablename>;

Для очистки всех таблиц:

=# VACUUM;

В дополнение к стандартной команде VACUUM можно использовать VACUUM FULL. Хотя VACUUM FULL освобождает больше дискового пространства, она работает значительно медленнее. Стандартная VACUUM может выполняться параллельно с обычными операциями базы данных — команды, такие как INSERT, UPDATE, DELETE и SELECT, продолжают работать нормально. Однако во время стандартной VACUUM нельзя использовать команды вроде ALTER TABLE для изменения определения таблицы. В отличие от этого, VACUUM FULL требует эксклюзивной блокировки целевой таблицы, что запрещает любой параллельный доступ. Поэтому администраторам следует, как правило, предпочитать стандартную VACUUM и избегать использования VACUUM FULL.

Степень блокировки других SQL-запросов во время VACUUM зависит от движка хранения:

Движок хранения INSERT UPDATE DELETE ALTER SELECT Физический размер файла
HEAP Не блокируется Не блокируется Не блокируется Блокируется Не блокируется Не изменяется
AO Не блокируется Не блокируется Не блокируется Блокируется Не блокируется Уменьшается
MARS2/MARS3 Не блокируется Не блокируется Не блокируется Блокируется Не блокируется Уменьшается

Примечание!
VACUUM создаёт значительную нагрузку на ввод-вывод, что может снизить производительность других активных сессий. Вы можете уменьшить это влияние, настроив параметры задержки очистки на основе стоимости. Подробности см. в разделе Очистка с учётом стоимости.

3.2 Автоматическая очистка

Автоматическая очистка выполняется демоном Autovacuum, задача которого — автоматически запускать команды VACUUM и ANALYZE. При включении:

  • Autovacuum отслеживает таблицы с интенсивной активностью вставки, обновления или удаления. Интервал проверок определяется параметром autovacuum_naptime.
  • Демон autovacuum состоит из нескольких процессов. Количество одновременно работающих воркеров контролируется параметром autovacuum_max_workers, значение по умолчанию — 3.
  • Autovacuum запускает VACUUM, когда:
    • Количество мёртвых кортежей в таблице превышает эффективный порог, рассчитанный по формуле: autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * number_of_rows.
  • Autovacuum запускает ANALYZE, когда:
    • Количество вставленных, удалённых или обновлённых строк с момента последнего анализа превышает эффективный порог, рассчитанный по формуле: autovacuum_analyze_threshold + autovacuum_analyze_scale_factor * number_of_rows.

Включите autovacuum и перезагрузите конфигурацию для применения изменений:

$ gpconfig -c autovacuum -v on
$ mxstop -u

Примечание!
Autovacuum требует включённого параметра track_counts (track_counts = on). Этот параметр включён по умолчанию.

Примечание!
Полный список параметров конфигурации, связанных с autovacuum, см. в разделе Параметры autovacuum.