Перейти к основному содержимому
Перейти к основному содержимому

Избегать Optimize Final

Таблицы ClickHouse, использующие движок MergeTree, хранят данные на диске в виде неизменяемых частей, которые создаются каждый раз при вставке данных.

Каждая вставка создает новую часть, содержащую отсортированные, сжатые файлы колонок, вместе с метаданными, такими как индексы и контрольные суммы. Для детального описания структур частей и способов их формирования мы рекомендуем этот гид.

Со временем фоновые процессы сливают меньшие части в более крупные, чтобы уменьшить фрагментацию и повысить производительность запросов.

Хотя может возникнуть искушение вручную инициировать это слияние с помощью:

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

Почему избегать?

Это дорого

Запуск OPTIMIZE FINAL заставляет ClickHouse слить все активные части в единую часть, даже если крупные слияния уже произошли. Это включает в себя:

  1. Декомпрессию всех частей
  2. Слияние данных
  3. Сжатие их снова
  4. Запись последней части на диск или в объектное хранилище

Эти шаги являются ресурсоемкими как по CPU, так и по вводу-выводу, и могут значительно нагрузить вашу систему, особенно когда речь идет о крупных наборах данных.

Это игнорирует ограничения безопасности

Обычно ClickHouse избегает слияния частей размером более ~150 ГБ (настраивается через max_bytes_to_merge_at_max_space_in_pool). Но OPTIMIZE FINAL игнорирует эту защиту, что означает:

  • Он может попытаться слить несколько частей по 150 ГБ в одну огромную часть
  • Это может привести к долгим временам слияний, напряжению памяти или даже ошибкам нехватки памяти
  • Эти большие части могут стать трудными для слияния, то есть попытки слить их дальше не удаются по вышеуказанным причинам. В случаях, когда слияния необходимы для корректного поведения времени выполнения запросов, это может привести к нежелательным последствиям, например, накоплению дубликатов для ReplacingMergeTree, увеличивая время выполнения запросов.

Позвольте фоновым слияниям выполнять работу

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