E
EvApps
@evapps_team198 подп.
141просмотров
71.2%от подписчиков
19 декабря 2025 г.
Score: 155
Продолжаем разбор движков ClickHouse! 3. CollapsingMergeTree (для контролируемых изменений) Этот движок позволяет явно управлять обновлениями и удалениями через специальный столбец-признак (sign): sign = 1 — добавить/актуальная версия строки sign = -1 — удалить/старая версия строки Пример таблицы для отслеживания статусов заказов: CREATE TABLE order_statuses ( order_id Int32, status String, updated_at DateTime, sign Int8 ) ENGINE = CollapsingMergeTree(sign) ORDER BY (order_id, updated_at); Как работает изменение статуса: -- Первоначальный статус INSERT INTO order_statuses VALUES (5001, 'pending', '2024-01-15 10:00:00', 1); -- Обновление статуса: удаляем старый, добавляем новый INSERT INTO order_statuses VALUES (5001, 'pending', '2024-01-15 10:00:00', -1), (5001, 'shipped', '2024-01-15 14:00:00', 1); Важно:  Как и в ReplacingMergeTree, схлопывание происходит в фоне. Для немедленного результата используйте FINAL. Особенности: CollapsingMergeTree позволяет более контролируемо обрабатывать обновления и удаления. Например, вы можете обновить ключи сортировки, вставив старую строку с sign=-1 и новую строку с новыми ключами сортировки и sign=1. 4. AggregatingMergeTree Этот движок автоматически вычисляет агрегаты при вставке данных, значительно ускоряя аналитические запросы. Пример — дневная статистика пользователей: -- Исходная таблица с активностью CREATE TABLE user_activity ( user_id Int32, action String, duration UInt32, event_date Date ) ENGINE = MergeTree ORDER BY (user_id, event_date); -- Материализованное представление с агрегатами CREATE MATERIALIZED VIEW user_daily_stats ENGINE = AggregatingMergeTree() ORDER BY (user_id, event_date) AS SELECT user_id, event_date, countState() as action_count, sumState(duration) as total_duration, uniqState(action) as unique_actions FROM user_activity GROUP BY user_id, event_date; Как использовать агрегированные данные: -- Вставка детальных данных INSERT INTO user_activity VALUES (1001, 'login', 120, '2024-01-15'), (1001, 'view', 300, '2024-01-15'), (1001, 'purchase', 60, '2024-01-15'); -- Получение агрегированных результатов SELECT user_id, event_date, countMerge(action_count) as actions, sumMerge(total_duration) as total_time, uniqMerge(unique_actions) as different_actions FROM user_daily_stats WHERE user_id = 1001 GROUP BY user_id, event_date; Этот движок помогает сократить время отклика на сложные, фиксированные аналитические запросы, рассчитывая их во время записи. Семейство Log: минималистичное хранение Эти движки максимально просты и быстры для записи, но не имеют индексов. TinyLog — для временных данных: CREATE TABLE temp_metrics ( metric_id UUID, value Float64, collected_at DateTime ) ENGINE = TinyLog; Применение: Промежуточные данные ETL, кэши, временные логи. Семейство Integration: работа с внешними системами MySQL Engine — доступ: CREATE TABLE remote_products ( id Int32, title String, category String ) ENGINE = MySQL('mysql-server:2206', 'shop', 'products', 'admin', 'password'); Теперь можно выполнять запросы к MySQL через ClickHouse: SELECT * FROM remote_products WHERE category = 'electronics'; Очевидно, что ClickHouse предлагает широкий спектр вариантов движков для различных сценариев использования. MergeTree является движком по умолчанию и подходит для большинства ситуаций, но при необходимости его можно заменить другими движками, правильный выбор движка для вашей конкретной задачи может значительно повысить производительность и эффективность работы с данными. Поэтому стоит потратить время на то, чтобы понять сильные и слабые стороны каждого движка и выбрать тот, который лучше всего соответствует вашим потребностям. Ну и будем продолжать тему
141
просмотров
4000
символов
Нет
эмодзи
Нет
медиа

Другие посты @evapps_team

Все посты канала →
Продолжаем разбор движков ClickHouse! 3. CollapsingMergeTree — @evapps_team | PostSniper