Size: a a a

ClickHouse не тормозит

2020 September 16

M

Maksimus Ulibikus in ClickHouse не тормозит
Dmitriy Maslennikov
если ресурсов мало, то в конце еще
После ORDER BY (server_name, request, event_date)?
источник

DM

Dmitriy Maslennikov in ClickHouse не тормозит
да
источник

M

Maksimus Ulibikus in ClickHouse не тормозит
Понятно. Спасибо Дмитрий.
источник

DM

Dmitriy Maslennikov in ClickHouse не тормозит
CREATE TABLE nginx.access_log
(
   event_datetime DateTime,
   event_date Date,
   server_name LowCardinality(String),
   remote_user String,
   http_x_real_ip UInt32,
   remote_addr UInt32,
   status UInt16,
   scheme LowCardinality(String),
   request_method LowCardinality(String),
   request_uri String,
   request_args String,
   server_protocol LowCardinality(String),
   body_bytes_sent UInt64,
   request_bytes UInt64,
   http_referer String,
   http_user_agent LowCardinality(String),
   request_time Float32,
   upstream_response_time Array(Float32),
   hostname LowCardinality(String),
   host LowCardinality(String),
   upstream_addr LowCardinality(String)
)
ENGINE = MergeTree()
PARTITION BY toMonday(event_date)
ORDER BY (hostname, request_uri, event_date)
TTL event_datetime + toIntervalMonth(1)
источник

DO

Dew Oughter in ClickHouse не тормозит
Всем привет! Проясните пожалуйста работу global not in по двум полям, если например такой запрос:
select id, name
from db1
where (id, name) global not in (select id, name from db2)
в таком случае исключаться только те строки где id и name в определенном сочетании как в db2 или исключатся все строки с таким id какой есть в db2 и аналогично с name?
я так понимаю что есть у нас в первой базе есть табличка:
id name
1  a
2  b
3  c
и во второй базе например записи:
1 a
1 b
1 c
то после выполнения запроса выше останется:
2  b
3  c
я верно понимаю?
источник

w

waaaaaaaaat in ClickHouse не тормозит
всем привет.
у нас есть вот такие примерно селекты.

SELECT
   domainName,
   arrayFlatten(groupUniqArray(categories)) AS categoriesArray,
   arrayFlatten(groupUniqArray(categoriesRoots)) AS categoriesRootsArray,
   arrayFlatten(groupUniqArray(filterType)) AS filterTypesArray,
   count() AS count
FROM decisions
PREWHERE
   userID = '123412341234' AND
   time >= toStartOfHour(subtractMonths(now(), 1)) AND
   policyID = '943075093475' AND
   campusID = '321846928346' AND
   dnsType IN (15, 12, 8, 5) AND
   hasAny(categories, ['#1', '#4', '#8', '#3', '#2']) AND
   hasAny(categoriesRoots, ['root #1'])
GROUP BY domainName
ORDER BY count DESC
LIMIT 1000;


в массивах, передаваемых в hasAny может быть и больше элементов.
стоит задача: понять, возможно ли уменьшить время выполнения таких запросов путем апгрейда серверного оборудования.
прочитал документацию (разделы про скорость и производительность), из нее понял, что вроде как на такие большие единоразовые запросы главным образом влияет т.н. disk speed (скорость диска).
однако, до конца не понял - только ли она или нет? какие хардварные элементы можно проапгрейдить, чтобы увеличить скорость?
и еще вопрос: возможно ли увеличить производительность путем разбиения кластера на большее кол-во шардов?
или мб есть еще какие-то методы увеличения производительности?

p.s. прошу прощения, если написал что-нибудь не то, я +- новичок в этой области.
источник

ДБ

Дмитрий Бережнов... in ClickHouse не тормозит
waaaaaaaaat
всем привет.
у нас есть вот такие примерно селекты.

SELECT
   domainName,
   arrayFlatten(groupUniqArray(categories)) AS categoriesArray,
   arrayFlatten(groupUniqArray(categoriesRoots)) AS categoriesRootsArray,
   arrayFlatten(groupUniqArray(filterType)) AS filterTypesArray,
   count() AS count
FROM decisions
PREWHERE
   userID = '123412341234' AND
   time >= toStartOfHour(subtractMonths(now(), 1)) AND
   policyID = '943075093475' AND
   campusID = '321846928346' AND
   dnsType IN (15, 12, 8, 5) AND
   hasAny(categories, ['#1', '#4', '#8', '#3', '#2']) AND
   hasAny(categoriesRoots, ['root #1'])
GROUP BY domainName
ORDER BY count DESC
LIMIT 1000;


в массивах, передаваемых в hasAny может быть и больше элементов.
стоит задача: понять, возможно ли уменьшить время выполнения таких запросов путем апгрейда серверного оборудования.
прочитал документацию (разделы про скорость и производительность), из нее понял, что вроде как на такие большие единоразовые запросы главным образом влияет т.н. disk speed (скорость диска).
однако, до конца не понял - только ли она или нет? какие хардварные элементы можно проапгрейдить, чтобы увеличить скорость?
и еще вопрос: возможно ли увеличить производительность путем разбиения кластера на большее кол-во шардов?
или мб есть еще какие-то методы увеличения производительности?

p.s. прошу прощения, если написал что-нибудь не то, я +- новичок в этой области.
Покажите запрос создания таблицы
источник

w

waaaaaaaaat in ClickHouse не тормозит
Дмитрий Бережнов
Покажите запрос создания таблицы
CREATE TABLE IF NOT EXISTS decisions (
   eventDate Date,
   time DateTime,
   apply UInt8,
   forceCNAME String,
   isUnclassified UInt8,
   dnsType UInt8,
   latency UInt64,
   decision Enum8('DROP' = 0, 'ALLOWED' = 1, 'FORBIDDEN' = 2),
   domainName String,
   clientIP String,
   reason String,
   filterType String,
   resolverID String,
   userID String,
   campusID String,
   policyID String,
   networkID String,
   categories Array(String),
   originCategories Array(String),
   policyLatency UInt64 DEFAULT CAST(0 AS UInt64),
   categoryLatency UInt64 DEFAULT CAST(0 AS UInt64),
   ednsOptions Nested
   (
       number UInt16,
       value String
   ),
   blockedCategory String,
   originBlockedCategory String
) ENGINE = ReplicatedMergeTree(
   '/clickhouse/tables/{shard}/decisions',
   '{replica}',
   eventDate,
   (domainName, time, decision),
   8192
);
источник

ДБ

Дмитрий Бережнов... in ClickHouse не тормозит
Dew Oughter
Всем привет! Проясните пожалуйста работу global not in по двум полям, если например такой запрос:
select id, name
from db1
where (id, name) global not in (select id, name from db2)
в таком случае исключаться только те строки где id и name в определенном сочетании как в db2 или исключатся все строки с таким id какой есть в db2 и аналогично с name?
я так понимаю что есть у нас в первой базе есть табличка:
id name
1  a
2  b
3  c
и во второй базе например записи:
1 a
1 b
1 c
то после выполнения запроса выше останется:
2  b
3  c
я верно понимаю?
Not IN отфильтрует по кортежу из двух колонок
источник

DO

Dew Oughter in ClickHouse не тормозит
Дмитрий Бережнов
Not IN отфильтрует по кортежу из двух колонок
спасибо
источник

ДБ

Дмитрий Бережнов... in ClickHouse не тормозит
Т. е где есть в одной строке db2 оба значения из колонок
источник

ДБ

Дмитрий Бережнов... in ClickHouse не тормозит
waaaaaaaaat
CREATE TABLE IF NOT EXISTS decisions (
   eventDate Date,
   time DateTime,
   apply UInt8,
   forceCNAME String,
   isUnclassified UInt8,
   dnsType UInt8,
   latency UInt64,
   decision Enum8('DROP' = 0, 'ALLOWED' = 1, 'FORBIDDEN' = 2),
   domainName String,
   clientIP String,
   reason String,
   filterType String,
   resolverID String,
   userID String,
   campusID String,
   policyID String,
   networkID String,
   categories Array(String),
   originCategories Array(String),
   policyLatency UInt64 DEFAULT CAST(0 AS UInt64),
   categoryLatency UInt64 DEFAULT CAST(0 AS UInt64),
   ednsOptions Nested
   (
       number UInt16,
       value String
   ),
   blockedCategory String,
   originBlockedCategory String
) ENGINE = ReplicatedMergeTree(
   '/clickhouse/tables/{shard}/decisions',
   '{replica}',
   eventDate,
   (domainName, time, decision),
   8192
);
1. Старый синтаксис создания таблицы, лучше переделать на с PARTITION BY... ORDER BY...
2. А чего в PK нет userId. Скорее всего это сильно сократит кол-во данных для чтения
источник

ЕО

Евгений Овчинников... in ClickHouse не тормозит
Привет, кластер из 2 узлов, один шард 2 реплики. Делаю бэкап через FREEZE партиций и копированием данных. Проблем нет, на каждом узле хранится 100% данных таблицы.
Возможно ли таким способом делать бэкап шардированных таблиц?
источник

ДБ

Дмитрий Бережнов... in ClickHouse не тормозит
И чем eventDate от time отличается?
источник

w

waaaaaaaaat in ClickHouse не тормозит
Дмитрий Бережнов
И чем eventDate от time отличается?
eventDate - дата, time - дата+время
на самом деле смотрю и думаю: на кой черт нужны эти оба столбца, если для проверки даты можно также использовать time :D
источник

w

waaaaaaaaat in ClickHouse не тормозит
Дмитрий Бережнов
1. Старый синтаксис создания таблицы, лучше переделать на с PARTITION BY... ORDER BY...
2. А чего в PK нет userId. Скорее всего это сильно сократит кол-во данных для чтения
спасибо! про синтаксис да, я уже видел, что сейчас таблицы иначе создаются. этот код несколько лет назад писался
подумаю над попыткой миграции на новый синтаксис. а это может иметь значение сейчас в производительности? или это вы просто за компанию добавили? (в любом случае спасибо)
источник

ДБ

Дмитрий Бережнов... in ClickHouse не тормозит
waaaaaaaaat
спасибо! про синтаксис да, я уже видел, что сейчас таблицы иначе создаются. этот код несколько лет назад писался
подумаю над попыткой миграции на новый синтаксис. а это может иметь значение сейчас в производительности? или это вы просто за компанию добавили? (в любом случае спасибо)
Есть какие-то нюансы, что лучше использовать новый синтаксис. Можно хранить как вы описали, тут смотрите сами
источник

MU

Max Ulan in ClickHouse не тормозит
Подскажите, пожалуйста, что не так с использованием runningAccumulate:
SELECT
   toDateTime(HOUR) AS HOUR,
   REACH,
   runningAccumulate(REACH_STATE) AS REACH_CUM
FROM
(
   SELECT
       toUnixTimestamp(toStartOfHour(toTimeZone(toDateTime(start_dt), 'America/New_York'))) AS HOUR,
       uniqExactState(account_id) AS REACH_STATE,
       uniqExact(account_id) AS REACH
   FROM viewing_events_2v4
   WHERE ((start_date >= '2019-12-01') AND (start_date < '2019-12-02')) AND (viewing_type = 0)
   GROUP BY HOUR
)
ORDER BY HOUR ASC
LIMIT 40000000

┌────────────────HOUR─┬───REACH─┬─REACH_CUM─┐
│ 2019-12-01 11:00:00 │ 1559016 │   1559016 │
│ 2019-12-01 12:00:00 │ 2098924 │   2098924 │
│ 2019-12-01 13:00:00 │ 2932804 │   2932804 │
│ 2019-12-01 14:00:00 │ 3660577 │   3660577 │
│ 2019-12-01 15:00:00 │ 4069815 │   4069815 │
│ 2019-12-01 16:00:00 │ 4242950 │   4242950 │
│ 2019-12-01 17:00:00 │ 4798137 │   4798137 │
│ 2019-12-01 18:00:00 │ 4138177 │   4138177 │
│ 2019-12-01 19:00:00 │ 3976740 │   3976740 │
│ 2019-12-01 20:00:00 │ 3956955 │   3956955 │
│ 2019-12-01 21:00:00 │ 4510383 │   4510383 │
│ 2019-12-01 22:00:00 │ 4804025 │   4804025 │
│ 2019-12-01 23:00:00 │ 5324659 │   5324659 │
│ 2019-12-02 00:00:00 │ 6375153 │   6375153 │
│ 2019-12-02 01:00:00 │ 6841633 │   6841633 │
│ 2019-12-02 02:00:00 │ 6809946 │   6809946 │
│ 2019-12-02 03:00:00 │ 6215249 │   6215249 │
│ 2019-12-02 04:00:00 │ 4960951 │   4960951 │
│ 2019-12-02 05:00:00 │ 3390838 │   6727948 │
│ 2019-12-02 06:00:00 │ 2533804 │   2533804 │
│ 2019-12-02 07:00:00 │ 1868437 │   1868437 │
│ 2019-12-02 08:00:00 │ 1448003 │   1448003 │
│ 2019-12-02 09:00:00 │ 1267589 │   1267589 │
│ 2019-12-02 10:00:00 │ 1280197 │   1280197 │
└─────────────────────┴─────────┴───────────┘

24 rows in set. Elapsed: 5.802 sec. Processed 479.94 million rows, 7.20 GB (82.72 million rows/s., 1.24 GB/s.)
Значения в колонке REACH_CUM должны только возрастать, а вместо этого, в основном, копируют значение REACH
источник

V

Vladimir in ClickHouse не тормозит
Привет! Прописываю listen_host для конкретного юзера и разрешаю ему внешние подключения. Все было нормально до того как мне понадобилось снимать prometheus.
 <prometheus>
       <endpoint>/metrics</endpoint>
       <port>8001</port>
       <metrics>true</metrics>
       <events>true</events>
       <asynchronous_metrics>true</asynchronous_metrics>
   </prometheus>
Порт открывается, но только на 0.0.0.0.
Можно как-то для него отдельно прописать listen_host чтобы не открывать весь CH всем пользователям?
источник

AS

Askhat Sarkeev in ClickHouse не тормозит
Привет,
Создал таблицу с движком ReplicatedReplacingMergeTree
Потом дропнул и попробовал написать в нее, но таблица перешла в readonly mode
При повторной попытке дропа выдеат следующее:

DB::Exception: Can't drop readonly replicated table (need to drop data in ZooKeeper as well)
источник