Работа над ошибками: 'Синтаксис'.
Практика: 'JOIN' - 'Массивы, Map и вложенные структуры*' - 'Партиции' - 'Индексы'.
This commit is contained in:
+86
@@ -0,0 +1,86 @@
|
||||
-- Задание 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');
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
-- Задание 1
|
||||
|
||||
CREATE TABLE mnoskov.logs
|
||||
ON CLUSTER clickhouse_cluster
|
||||
(
|
||||
log_id UInt64,
|
||||
ts DateTime
|
||||
)
|
||||
ENGINE=ReplicatedMergeTree(
|
||||
'/clickhouse/tables/{shard}/mnoskov/logs_ttl',
|
||||
'{replica}'
|
||||
)
|
||||
ORDER BY ts;
|
||||
ALTER TABLE mnoskov.logs ADD INDEX idx_ts ts TYPE minmax granularity 2;
|
||||
|
||||
SELECT * FROM logs WHERE ts BETWEEN '2024-06-02' AND '2024-06-03';
|
||||
|
||||
-- 2 У меня нет доступа к системным таблицам, я не могу посмотреть.
|
||||
-- Если в order by будет log_id а не ts, то индекс не будет работать.
|
||||
|
||||
|
||||
-- Задание 2
|
||||
|
||||
CREATE TABLE mnoskov.clicks
|
||||
ON CLUSTER clickhouse_cluster
|
||||
(
|
||||
id UInt64,
|
||||
country String
|
||||
)
|
||||
ENGINE=ReplicatedMergeTree(
|
||||
'/clickhouse/tables/{shard}/mnoskov/clicks',
|
||||
'{replica}'
|
||||
)
|
||||
ORDER BY id;
|
||||
|
||||
ALTER TABLE mnoskov.clicks ADD INDEX idx_country country TYPE set(1000) GRANULARITY 2;
|
||||
ALTER TABLE mnoskov.clicks DROP INDEX idx_country;
|
||||
|
||||
explain
|
||||
SELECT * FROM clicks WHERE country = 'RU';
|
||||
-- 3 не использутся индеск, я туда 11тыс строк заинсертил, все равно не используется.
|
||||
-- 4 я думаю индекс не будет работать эффективно, а может быть и вообще будет запрос замедлять.
|
||||
|
||||
|
||||
-- Задание 3
|
||||
|
||||
CREATE TABLE mnoskov.users
|
||||
ON CLUSTER clickhouse_cluster
|
||||
(
|
||||
id UInt64,
|
||||
email String
|
||||
)
|
||||
ENGINE=ReplicatedMergeTree(
|
||||
'/clickhouse/tables/{shard}/mnoskov/users_simple',
|
||||
'{replica}'
|
||||
)
|
||||
ORDER BY id;
|
||||
|
||||
ALTER TABLE mnoskov.users ADD INDEX idx_email email TYPE bloom_filter(0.01) GRANULARITY 2;
|
||||
|
||||
explain
|
||||
SELECT * FROM users WHERE email = 'alice@mail.com';
|
||||
-- 2 Ну я не вижу в EXPLAIN какое либо упоминание индекса, но я ссылаюсь на то, что просто мало данных в таблице.
|
||||
|
||||
-- 3 Потому что этот индекс работает только на точные совпадения - exact match.
|
||||
|
||||
explain
|
||||
SELECT * FROM users WHERE email LIKE 'alice%';
|
||||
-- 4 Индекс не будет использоваться.
|
||||
Reference in New Issue
Block a user