惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Jina AI
Jina AI
WordPress大学
WordPress大学
Recent Announcements
Recent Announcements
G
Google Developers Blog
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Check Point Blog
J
Java Code Geeks
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
量子位
A
About on SuperTechFans
D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
ClickHouse не тормозит, но не умеет в DML. Часть 2. Appen...
Трофим Воробьев · 2026-05-18 · via Все публикации подряд на Хабре

2 мин

6.9K

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: быстрый старт