103 lines
3.0 KiB
SQL
103 lines
3.0 KiB
SQL
# Задачи на отработку:
|
||
|
||
### **Задача 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;
|