|
Professor Seleznov
|
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 = MergeTree ORDER BY id SETTINGS 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: быстрый старт-Источник
|
|
|