OPTIMIZE FINAL — это DDL-команда, которая физически и необратимо реорганизует
и оптимизирует данные на диске. Она физически объединяет data parts в таблицах MergeTree,
одновременно выполняя дедупликацию данных за счет удаления дублирующихся строк из хранилища.
FINAL — это модификатор на этапе выполнения запроса, который возвращает дедуплицированные результаты без
изменения структуры хранимых данных. Он применяет логику слияния при
чтении. Его действие временно и влияет только на результат текущего запроса.
Пользователям часто рекомендуют избегать OPTIMIZE FINAL, поскольку он создает
существенную нагрузку на производительность, однако не стоит путать его с FINAL. Во многих случаях
необходимо использовать FINAL, чтобы получить результаты без дубликатов, особенно при использовании табличных
движков, таких как ReplacingMergeTree, которые могут содержать дублирующиеся строки, еще не
замещенные в ходе фонового процесса слияния, происходящего со временем.
Таблица ниже суммирует ключевые различия:
Когда использовать каждый вариант
OPTIMIZE FINAL, когда:
- Вы хотите надолго повысить производительность запросов
- Вы можете позволить себе разовые затраты на оптимизацию
- Вы выполняете периодическое обслуживание таблиц
- Вы хотите физически удалить дубликаты данных
FINAL, когда:
- Вам сразу нужны дедуплицированные результаты
- Вы не можете ждать завершения постоянной оптимизации или не хотите её выполнять
- Дедуплицированные данные нужны вам лишь время от времени
- Вы работаете с данными, которые часто меняются