TGViewer
дата инженеретта дата инженеретта @data_engineerette · 3.43K subscribers
Post #393 2.53K
CollapsingMergeTree

Прохожу бесплатный курс по кх "Managed Service for ClickHouse". Дошла до модуля 2 про виды движков, и меня настигло озарение ☁️

Вот есть движок CollapsingMergeTree - он сворачивает пары строк, у которых в ключе сортировки одинаковые значения, но при этом поле sign у одной из них равно 1, а у другой -1. Без паники! 🤚 Сейчас поясню на примере

CREATE TABLE user_activity (
UserID UInt64, --есть пользак
PageViews UInt8, --он посетил столько страниц
Sign Int8 --системное поле
)
ENGINE = CollapsingMergeTree(Sign)
ORDER BY UserID; --будем сворачивать по этому полю


Наш пользак 999 захотел что-то купить:

INSERT INTO user_activity VALUES (999, 10, 1); --сначала просмотрел 10 страниц
INSERT INTO user_activity VALUES (999, 10, -1), --а теперь 10 страниц уже неактуальны (видите -1?)
(999, 11, 1); --потому что он просмотрел 11 страниц


Т.е. тут явно видно, что update = delete + insert, где sign - это флажок удаления

Но есть нюанс - теперь в нашей таблице 3 строки, а нужна 1. Почему 3, ведь CollapsingMergeTree как раз и должен сам все объединить?

Потому что кх свои слияния производит не сразу, а когда-то потом. Но есть несколько способов получить то, что нужно:

1. FINAL - как будто слияние уже произошло

SELECT * FROM user_activity FINAL;


2. OPTIMIZE - заставляем сделать слияние прямо сейчас. Но у вас может не быть прав на это в продовой базе

OPTIMIZE TABLE user_activity;
SELECT * FROM user_activity; --FINAL уже не нужен


3. Посчитать самим

SELECT UserID, sum(PageViews * Sign)
FROM user_activity
group by UserID;


А ведь действительно 10*1 + 10*(-1) + 11*1 дает то, что нужно…
  • 👍 13
  • 🔥 5
  • 🌚 2
  • 👀 2
  • ❤ 1
More from @data_engineerette
  1. Sep 25, 2026Как прошла SmartData 2026? Я вот перечитываю свои впечатления от прошлого года и понимаю,…
  2. Sep 24, 2026Исследование data-people Тут ребята из DevCrowd запустили ежегодное исследование специалис…
  3. Sep 22, 20265 октября начнется 19-й поток программы Data Engineer от Newprolab Программа для junior- и…
  4. Sep 15, 2026Каким должен быть хороший DE? Меня однажды спросили на собесе: 🤩Какие 3 качества важны дл…
  5. Sep 12, 2026Mermaid-диаграммы Наконец-то дошли руки поковыряться в mermaid-диаграммах, это что за имба…
  6. Sep 2, 2026Iceberg — это внезапный бум или планомерная подготовка? Заметили, как с определенного моме…
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 →