ae208a76fb
Практика: 'JOIN' - 'Массивы, Map и вложенные структуры*' - 'Партиции' - 'Индексы'.
86 lines
2.2 KiB
SQL
86 lines
2.2 KiB
SQL
-- Задание 1
|
|
|
|
CREATE TABLE mnoskov.sales
|
|
ON CLUSTER clickhouse_cluster
|
|
(
|
|
id UInt64,
|
|
region String,
|
|
sale_date Date,
|
|
amount Float64
|
|
)
|
|
ENGINE=ReplicatedMergeTree(
|
|
'/clickhouse/tables/{shard}/mnoskov/sales',
|
|
'{replica}'
|
|
)
|
|
PARTITION BY toYYYYMM(sale_date)
|
|
ORDER BY sale_date;
|
|
|
|
ALTER TABLE mnoskov.sales DROP PARTITION '202405';
|
|
SELECT * FROM mnoskov.sales;
|
|
-- Пропали строки где год/месяц 202405.
|
|
-- Если не указывать PARTITION BY, то строки бы искались по всей таблице, что дольше и затранее.
|
|
|
|
|
|
-- Задание 2
|
|
|
|
CREATE TABLE mnoskov.events
|
|
ON CLUSTER clickhouse_cluster
|
|
(
|
|
id UInt64,
|
|
event_type String,
|
|
event_date Date
|
|
)
|
|
ENGINE=ReplicatedMergeTree(
|
|
'/clickhouse/tables/{shard}/mnoskov/events_partitioned',
|
|
'{replica}'
|
|
)
|
|
PARTITION BY event_type
|
|
ORDER BY event_date;
|
|
|
|
ALTER TABLE mnoskov.events DROP PARTITION 'click';
|
|
ELECT * FROM mnoskov.events;
|
|
-- Такой подход опасен, тк например login выполняется не часто по сравнению с click и получается жесткий перевес.
|
|
|
|
|
|
-- Задание 3
|
|
|
|
CREATE TABLE mnoskov.logs
|
|
ON CLUSTER clickhouse_cluster
|
|
(
|
|
id UInt64,
|
|
user_id UInt64,
|
|
log_time DateTime
|
|
)
|
|
ENGINE=ReplicatedMergeTree(
|
|
'/clickhouse/tables/{shard}/mnoskov/logs_partitioned',
|
|
'{replica}'
|
|
)
|
|
PARTITION BY cityHash64(user_id) % 100
|
|
ORDER BY log_time;
|
|
|
|
SELECT * FROM mnoskov.logs
|
|
|
|
-- 2 с точки зрения баланса, у нас юзеры распределные равномерно и нет никаких перекосов.
|
|
-- 3 хз если честно, мне кажется должны ускорять.
|
|
|
|
|
|
-- Задание 4
|
|
|
|
CREATE TABLE mnoskov.visits
|
|
ON CLUSTER clickhouse_cluster
|
|
(
|
|
id UInt64,
|
|
region String,
|
|
visit_date Date
|
|
)
|
|
ENGINE=ReplicatedMergeTree(
|
|
'/clickhouse/tables/{shard}/mnoskov/visits',
|
|
'{replica}'
|
|
)
|
|
PARTITION BY (region, toYYYYMM(visit_date))
|
|
ORDER BY visit_date;
|
|
|
|
SELECT * FROM mnoskov.visits;
|
|
-- 2 доступа к системным таблицам нет, потэтому я не могу посмотреть имя партиции.
|
|
-- 3 ну да
|
|
ALTER TABLE mnoskov.visits DROP PARTITION ('RU', '202407'); |