Append-only — целебная пилюля для ClickHouse. Разберем что это, и как этим пользоваться.
Напоминаю, что ClickHouse очень плохо умеет в DML — рекомендую к прочтению первую статью.
Ну а решение очень простое — Append-only. Это концепция, согласно которой данные в таблицы только добавляются. Никаких обновлений.
Перейдем сразу к примеру:
Создадим таблицу для теста:
create table t1 engine=MergeTree order by id as (select 1 as id, 'qq' as name union all select 2 as id, 'bb' as name);

А теперь представим, что при id=1 хотим, чтобы name=’xx’ вместо ‘qq’. Для этого мы просто вставляем новую запись:
insert into t1 values(1, 'xx');

Теперь встает логичный вопрос: а как мы поймем, какая из записей актуальная? Очевидно, нужно версионирование данных. Способов это сделать много, но покажу самый элегантный и беспроблемный, на мой взгляд.
Нам понадобится добавить колонку с временем вставки записи в таблицу. Таким образом, актуальная запись будь та, у которой наибольшее время. Для этого лучше пересоздать таблицу во избежание проблем.
CREATE TABLE t1( `id` UInt8, `name` String, `dt_load` DateTime DEFAULT now())ENGINE = MergeTreeORDER BY idSETTINGS index_granularity = 8192;
Мы добавили в таблицу колонку dt_load, значение которой определяется в момент вставки записи в таблицу. now() — текущее время. DEFAULT — выбрать now(), если пользователь ничего не вставляет в колонку. Таким образом мы можем как сами определять время для версионирования, так и возложить эту ношу на клик (что и сделаем).
Вставляем записи:
insert into t1 (id, name) values (1, 'qq'), (2, 'bb');

Видим, что у обеих записей одинаковое время. Это тот самый момент времени, когда мы добавили данные в таблицу.
Ну а теперь вставляем нужное нам значение:
insert into t1 (id, name) values (1, 'xx');

И теперь видим результат: у нас есть версионирование. Основная проблема решена — мы избавились от DML. Но получили теоретическую другую — дублирование записей. И если хранение истории версионирования не нужно — то можно использовать движок ReplacingMergeTree вместо MergeTree. Он будет автоматически удалять дубли, оставляя только одну запись по каждому id, у которой dt_load наибольший среди дублей.
Заключение:
Append-only + версионирование — концепция, позволяющая избавиться от дорогостоящих DML запросов. ClickHouse без нее скорее обуза, нежели буст для бизнеса.
Из этих двух статей мы поняли, ClickHouse — штука мощная, но со своим характером.
Осваивать этого зверя можно двумя способами. Первый — героический: месяцами вчитываться в документацию, собирать грабли по крупицам из форумов (привет Хабр) и всевозможных чатов. Второй — прагматичный: пройти бесплатный курс, состоящий из 5 часов видеолекций, от автора этой статьи. В нем все шишки уже набиты, а опыт упакован в понятные уроки.
Выбирайте путь умного, ведь время=деньги.
ClickHouse: быстрый старт
ссылка на оригинал статьи https://habr.com/ru/articles/1036162/