TGViewer
что-то на инженерном что-то на инженерном @chtotonainzhenernom · 1.17K subscribers
Post #164 1.85K
Разбираемся с TTL в Clickhouse

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

С помощью TTL (Time-to-Live) в Clickhouse можно настроить автоматический перенос данных старше 30 дней в холодное хранилище, а в быстром доступе оставить агрегированные данные для статистики. Как это сделать расскажу ниже.

Что такое TTL?
TTL задает правило, по которому данные (строки или значения столбцов) автоматически обновляются или удаляются после истечения указанного времени, обычно связанного со столбцом типа Date, DateTime или DateTime64.

Важно: TTL-операции (удаление, обновление) выполняются не мгновенно. Они происходят во время фоновых операций слияния (merges) частей данных. Если части долго не сливаются, устаревшие строки могут сохраняться в таблице дольше указанного срока.


Виды TTL

🟣TTL для столбца задает правило для конкретного поля таблицы: через заданный интервал значение этого столбца заменяется на значение по умолчанию.

Если все значения столбца в части таблицы устарели, Clickhouse удалит этот столбец из части, экономя место. Такой подход полезен для частичной очистки данных, например, удаления чувствительных атрибутов (IP, имя пользователя) через сутки, но сохранения остальной информации.

Например:
ip_address String TTL event_time + INTERVAL 1 DAY;


➡️ Через сутки IP-адрес будет заменен на значение '' (пустую строку).

Или
price Float64 TTL event_time + INTERVAL 1 MONTH GROUP BY product_id SET price = avg(price);


➡️ Через месяц агрегируются данные по product_id.

🟣TTL для таблицы задает условие для удаления всех строк целиком. Например, хранение логов за 30 дней, по истечении которых устаревшие строки полностью удаляются. Это более простое и часто используемое правило управления историей данных.

Например:
TTL event_date + INTERVAL 30 DAY
TO VOLUME 'cold_storage'
DELETE;


➡️ Через 30 дней данные переместятся на том cold_storage, а после дальнейшего срока удалятся.

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


Рекомендации по настройке TTL

⭐️Официальной докой рекомендуется всегда включать настройку ttl_only_drop_parts

Параметр ttl_only_drop_parts = 1 означает, что Clickhouse будет удалять только целые части данных, в которых все строки устарели по TTL, вместо попыток частичного удаления строк внутри части.
Это существенно облегчает процесс удаления и снижает нагрузку.

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


⭐️С включенной ttl_only_drop_parts можно уменьшить значение merge_with_ttl_timeout - интервала между слияниями с удалением устаревших частей, поскольку операция удаления становится проще и занимает меньше ресурсов.

Это снижает влияние TTL на производительность сервера и уменьшает время реакции на удаление устаревших данных.

По умолчанию составляет 14400 секунд (4 часа), но можно безопасно уменьшать, например, до 300-600 секунд.
При слишком низком значении могут возникать частые внеплановые слияния, что увеличит нагрузку на систему.


⭐️Принудительно запустить применение TTL можно командой:
ALTER TABLE my_table MATERIALIZE TTL;


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

Подробнее про TTL и больше примеров ➡️ в моей статье на Medium.

©️что-то на инженерном
Medium Mastering TTL in ClickHouse: Automating Data Lifecycle TTL (Time-to-Live) in ClickHouse is a built-in mechanism that automatically manages your data by deleting, moving, or aggregating it based…
  • 🔥 14
  • 👍 6
  • ❤ 5
  • ✍ 1
More from @chtotonainzhenernom
  1. Sep 21, 20265 октября начнется 19-й поток программы Data Engineer от Newprolab Программа для junior- и…
  2. Aug 1, 2026На днях стала свидетелем неприятной ситуации. Началось все с того, что я провела K. мок-со…
  3. Jun 13, 2026StarRocks DB В предыдущем посте я упомянула, что сейчас активно занимаюсь задачами миграци…
  4. May 23, 2026Сто лет ничего не писала, потому что было очень много настоящей инженерной работы. Моя ком…
  5. Apr 10, 2026Ищем проблемный запрос в ClickHouse Если CPU на пределе, память почти закончилась, а запро…
  6. Mar 31, 2026Хочу поделиться классной штукой - симулятором карьерного пути дата инженера от Джо Рейса,…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →