Не используйте OPTIMIZE FINAL
Таблицы ClickHouse, использующие движок MergeTree, хранят данные на диске в виде неизменяемых частей, которые создаются каждый раз при вставке данных.
Каждая вставка создает новую часть, содержащую отсортированные, сжатые файлы столбцов, а также метаданные, такие как индексы и контрольные суммы. Подробное описание структуры частей и процесса их формирования приведено в этом руководстве.
Со временем фоновые процессы объединяют более мелкие части в более крупные, чтобы уменьшить фрагментацию и улучшить производительность запросов.

Хотя может быть заманчиво выполнить это слияние вручную, используя:
в большинстве случаев следует избегать выполнения операции OPTIMIZE FINAL, так как она запускает
ресурсоёмкие процессы, которые могут повлиять на производительность кластера.
OPTIMIZE FINAL — это не то же самое, что FINAL, который иногда необходимо использовать,
чтобы получить результаты без дубликатов, например, с ReplacingMergeTree. Как правило,
FINAL допустимо использовать, если в ваших запросах фильтрация идёт по тем же столбцам, что и в
первичном ключе.
Почему этого следует избегать?
Это дорого по ресурсам
Выполнение OPTIMIZE FINAL заставляет ClickHouse слить все активные части в одну часть, даже если крупные слияния уже происходили. Это включает:
- Декомпрессию всех частей
- Слияние данных
- Повторную компрессию
- Запись итоговой части на диск или в объектное хранилище
Эти шаги интенсивно используют CPU и I/O и могут сильно нагружать систему, особенно при работе с большими наборами данных.
Игнорируются защитные лимиты
Обычно ClickHouse избегает слияния частей размером более ~150 ГБ (настраивается через max_bytes_to_merge_at_max_space_in_pool). Но OPTIMIZE FINAL игнорирует этот механизм защиты, что означает:
- Может быть предпринята попытка слить несколько частей по 150 ГБ в одну огромную часть
- Это может привести к длительным операциям слияния, дефициту памяти или даже ошибкам out-of-memory (OOM)
- Такие крупные части могут стать сложными для дальнейшего слияния, то есть попытки объединить их далее будут завершаться сбоем по описанным выше причинам. В случаях, когда слияния необходимы для корректного поведения запросов во время выполнения, это может привести к нежелательным последствиям, таким как накапливание дубликатов для ReplacingMergeTree, что снижает производительность выполнения запросов.
Пусть фоновые слияния делают свою работу
ClickHouse уже выполняет интеллектуальные фоновые слияния, чтобы оптимизировать хранение и эффективность выполнения запросов. Они инкрементальные, учитывают использование ресурсов и соблюдают настроенные пороговые значения. Если у вас нет какой-то очень специфической потребности (например, нужно финализировать данные перед заморозкой таблицы или экспортом), лучше доверить управление слияниями самому ClickHouse.