# Задачи на отработку: ### **Задача 1.** На каждой ноде(узел) есть таблица logs, в которой пишутся события. CREATE TABLE logs ( dt DateTime, user_id UInt32, event_type String ) ENGINE = MergeTree ORDER BY dt; 1. Создай распределённую таблицу dist_logs поверх logs с помощью ENGINE = Distributed. CREATE TABLE dist_logs ON CLUSTER clickhouse_cluster ENGINE = Distributed( 'clickhouse_cluster', 'dmedvedev', 'logs', rand() ); 2. Объясни, зачем нужен параметр rand() в Distributed(...). ЭТО КЛЮЧ ШАРДИРОВАНИЯ, ОН ПОЗВОЛЯЕТ РАСПРЕДЕЛИТЬ ДАННЫЕ РАНДОМНО И РАВНОМЕРНО ПО РАЗЛИЧНЫМ СЕРВЕРАМ. ### **Задача 2.** Есть таблица events(user_id, event_type, ts) CREATE TABLE events ( user_id UInt32, event_type String, ts DateTime ) ENGINE = MergeTree ORDER BY (ts, user_id); 1. Создай VIEW top_active_users, который показывает топ-100 пользователей по числу событий. CREATE VIEW top_active_users AS SELECT user_id, COUNT(*) AS total_logs_user FROM events GROUP BY user_id ORDER BY total_logs_user DESC LIMIT 100; 2. Объясни, почему VIEW не подходит, если нам нужно часто показывать это в дашборде с миллионами строк. ПОТОМУ ЧТО ПРЕДСТАВЛЕНИЮ VIEW НЕ ОБЛАДАЕТ СВОЙСТВОМ ХРАНЕНИЯ ИНФОРМАЦИИ, ПОСТОЯННО БУДУТ ПРОИСХОДИТЬ ТАКИЕ ПОВТОРНЫЕ ЗАПРОСЫЫ, КОТОРЫЕ БУДУТ ЗАСОРЯТЬ ПАМЯТЬ, ДЛЯ ТАКИХ ЗАДАЧ МОЖЕТ БЫТЬ ИСПОЛЬЗОВАНО МАТЕРИАЛИЗОВАННОЕ ПРЕДСТАВЛЕНИЕ. ### **Задача 3.** Таблица raw_events содержит "сырые" клики по сайту. CREATE TABLE raw_events ( event_time DateTime, user_id UInt32, event_type String ) ENGINE = MergeTree ORDER BY (event_time, user_id); 1. Создай Materialized View mv_clicks_per_day, который считает число кликов по дням. CREATE MATERIALIZED VIEW mv_clicks_per_day ENGINE = SummingMergeTree ORDER BY = user_id AS SELECT toDate(event_time) AS DAY, count(*) AS count_of_enent FROM raw_events; 2. В движке используй SummingMergeTree, а исходник — raw_events. 3. Проверь, что при INSERT INTO raw_events данные появляются и в mv_clicks_per_day. INSERT INTO raw_events (event_time, user_id, event_type) VALUES ('2026-01-01', 1, 'abc'), ('2026-02-01', 2, 'hdf'), ('2026-02-03', 3, 'hhj'), ('2026-03-04', 4, 'sdf'), ('2026-01-01', 5, 'gf'); CREATE MATERIALIZED VIEW mv_clicks_per_day ENGINE = SummingMergeTree ORDER BY (DAY) AS SELECT toDate(event_time) AS DAY, toUInt64(1) AS count_of_event FROM raw_events GROUP BY DAY;