Size: a a a

ClickHouse не тормозит

2020 May 14

DC

Denny Crane (I don't... in ClickHouse не тормозит
blkmrkt
Ребят, я делаю шеллскрипт для запуска clickhouse-server - мог бы и демонизировать, но у нас так не принято.

Как сделать так, чтоб после запуска сервера всегда исполнялись несколько SQL запросов? Там просто создаются основные таблицы. Может в конфиге самого сервера есть такой параметр?
ну если простая не Replicated то .sql (attach ) можно просто положить в /metadata или запускать дочерний процесс (bash) & до старта кх и в нем ждать старта КХ и выполнять скрипт
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Dimitriy Scherbenko
коллеги, подскажите, пожалуйста, как можно ужать в памяти подзапрос? ухожу в превышение лимита. для MV использую aggregatedMergeTree.

select  city_id
       ,median(order_cnt)
from(
   select  city_id
           ,user_id
           ,toYYYYMM(st_date) as my
           ,countMerge(order_amount) as order_cnt
   from  users
   group by city_id
            ,user_id
            ,toYYYYMM(st_date)
   )
group by city_id;
источник

b

blkmrkt in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
ну если простая не Replicated то .sql (attach ) можно просто положить в /metadata или запускать дочерний процесс (bash) & до старта кх и в нем ждать старта КХ и выполнять скрипт
благодарю!
источник

OM

Oleksandr Maksymeniu... in ClickHouse не тормозит
Datagrip вываливает ошибку: “java.lang.Throwable” и никаких деталей, перебирая части запроса пришел к выводу, что ругается на то, что в группировке используется “WITH TOTALS” версия КХ 20.1.2.4 может есть какой-то баг или специфика?
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
JDBC вообще не умеет WITH TOTALS, потому что JAVA/JDBC не предусматривает это

используйте group by rollup
источник

M

M in ClickHouse не тормозит
@den_crane Помогите, пожалуйста.

Есть таблица

CREATE TABLE data_vault_stage.hubGln (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
glnCode String
) ENGINE = MergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192

к ней мат представление

CREATE MATERIALIZED VIEW data_vault_stage.hubGln_mv (
glnHashKey FixedString(20),
lastSeenDate AggregateFunction(max,
DateTime)
) ENGINE = AggregatingMergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192
AS
SELECT glnHashKey, maxState(loadDate) AS lastSeenDate FROM data_vault_stage.hubGln GROUP BY glnHashKey

Таблица data_vault_stage.hubGln транкейтится 1 раз в час и в нее вставляются новые данные.

Также есть такая таблица, в которую данные только добавляются через insert-select:

CREATE TABLE data_vault_core.hubGln (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
glnCode String
) ENGINE = MergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192

и вот такое представление

CREATE VIEW data_vault_core.hubGln_view (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
lastSeenDate DateTime,
glnCode String) AS SELECT glnHashKey,
loadDate,
recordSource,
lastSeenDate,
glnCode FROM (SELECT glnHashKey,
loadDate,
recordSource,
glnCode FROM data_vault_core.hubGln) ALL LEFT JOIN (SELECT glnHashKey,
maxMerge(lastSeenDate) AS lastSeenDate FROM data_vault_stage.hubGln_mv GROUP BY glnHashKey) USING (glnHashKey)


Есть еще достаточно сложное представление, частью которого является такой подзапрос, а к нему много чего прилоединяется левым соединением:

SELECT glnHashKey,
recordSource,
glnCode FROM data_vault_core.hubGln_view WHERE dateDiff('second',
lastSeenDate,
(SELECT max(lastSeenDate) FROM data_vault_core.hubGln_view)) < (60 * 10)


Собственно, вопрос:
Запрос к сложному представлению исполняется около 10 секунд. В момент исполнения таблица data_vault_stage.hubGln  может быть очищена и в нее могут быть вставлены новые данные (происходит это 1 раз в час). В loadDate всегда вставляется now().
Есть примерно <1% случаев, когда этот запрос может не вернуть данных, полагаю, что это связано с dateDiff, так как не полняется условие в where. Но с другой стороны, при исполнении запроса разве не создается снапшота
всех используемых таблиц на определенный момент времени? Нормально ли для КХ, что он так себя ведет и как можно избежать подобной ситуации?
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
M
@den_crane Помогите, пожалуйста.

Есть таблица

CREATE TABLE data_vault_stage.hubGln (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
glnCode String
) ENGINE = MergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192

к ней мат представление

CREATE MATERIALIZED VIEW data_vault_stage.hubGln_mv (
glnHashKey FixedString(20),
lastSeenDate AggregateFunction(max,
DateTime)
) ENGINE = AggregatingMergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192
AS
SELECT glnHashKey, maxState(loadDate) AS lastSeenDate FROM data_vault_stage.hubGln GROUP BY glnHashKey

Таблица data_vault_stage.hubGln транкейтится 1 раз в час и в нее вставляются новые данные.

Также есть такая таблица, в которую данные только добавляются через insert-select:

CREATE TABLE data_vault_core.hubGln (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
glnCode String
) ENGINE = MergeTree() ORDER BY glnHashKey SETTINGS index_granularity = 8192

и вот такое представление

CREATE VIEW data_vault_core.hubGln_view (
glnHashKey FixedString(20),
loadDate DateTime,
recordSource String,
lastSeenDate DateTime,
glnCode String) AS SELECT glnHashKey,
loadDate,
recordSource,
lastSeenDate,
glnCode FROM (SELECT glnHashKey,
loadDate,
recordSource,
glnCode FROM data_vault_core.hubGln) ALL LEFT JOIN (SELECT glnHashKey,
maxMerge(lastSeenDate) AS lastSeenDate FROM data_vault_stage.hubGln_mv GROUP BY glnHashKey) USING (glnHashKey)


Есть еще достаточно сложное представление, частью которого является такой подзапрос, а к нему много чего прилоединяется левым соединением:

SELECT glnHashKey,
recordSource,
glnCode FROM data_vault_core.hubGln_view WHERE dateDiff('second',
lastSeenDate,
(SELECT max(lastSeenDate) FROM data_vault_core.hubGln_view)) < (60 * 10)


Собственно, вопрос:
Запрос к сложному представлению исполняется около 10 секунд. В момент исполнения таблица data_vault_stage.hubGln  может быть очищена и в нее могут быть вставлены новые данные (происходит это 1 раз в час). В loadDate всегда вставляется now().
Есть примерно <1% случаев, когда этот запрос может не вернуть данных, полагаю, что это связано с dateDiff, так как не полняется условие в where. Но с другой стороны, при исполнении запроса разве не создается снапшота
всех используемых таблиц на определенный момент времени? Нормально ли для КХ, что он так себя ведет и как можно избежать подобной ситуации?
SELECT glnHashKey,
recordSource,
glnCode FROM data_vault_core.hubGln_view WHERE dateDiff('second',
lastSeenDate,
(SELECT max(lastSeenDate) FROM data_vault_core.hubGln_view)

с т.з. КХ тут два селект и они видят 2 разных таблицы, т.е. SELECT max(lastSeenDate) выполняется над неочищенной таблицей, SELECT glnHashKey над очищенной
источник

M

M in ClickHouse не тормозит
Я так и подозревал, а можно ли как-то избежать такой ситуации, помимо смены разницы времени с 10 минут до > 1 часа?
источник

M

M in ClickHouse не тормозит
Я так понимаю, если полностью избавиться от представлений в этом запросе, то это тоже не гарантия?
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
наверное надо создавать hubGln_new, вставлять данные в нее, потом rename table hubGln to hubGln_old, hubGln_new to hubGln; -- одна команда и с точки зрения select она атомарная. drop table hubGln_old
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
а хотя два селекта опять увидят разное, не знаю, как-то сложнее надо, хранить больше дропать часовые партиции позже
источник

Р

Рич in ClickHouse не тормозит
а есть какой-то способ хранить схему таблиц удобным способом?

вряд ли это задача именно под КХ, но я для него пытаюсь сейчас сделать ETL процесс. Пока храню в словаре питоновском просто {table:{field:type,...}}. Видел где-то гугловский protobuf используют
источник

M

M in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
наверное надо создавать hubGln_new, вставлять данные в нее, потом rename table hubGln to hubGln_old, hubGln_new to hubGln; -- одна команда и с точки зрения select она атомарная. drop table hubGln_old
Понял, ок. Спасибо
источник

KL

Kamiλ Liberal-free in ClickHouse не тормозит
Добрый вечер.

Вопрос слегка абстрактный:
У меня GROUP BY по 3 полям в 8 таблицах (через merge, в сумме там 1 миллиард записей) выполняется 3 секунды. На что сразу стоит обратить внимание, что можно придумать, чтобы ускорить выборки.
источник

D

Dmitry in ClickHouse не тормозит
как человек, ещё не очень испорченный кликхаусом, замечу, что с такими вводными 3 секунды - это очень быстро)
источник

D

Dmitry in ClickHouse не тормозит
но могу дать не менее абстрактный совет как-то готовить данные в отдельные таблички, чтобы селект делал меньше работы
источник

D

Dmitry in ClickHouse не тормозит
оптимизации, впрочем, обычно работают эксплуатацией деталей, углов, которые можно срезать - а про это сложно говорить абстрактно
источник

KL

Kamiλ Liberal-free in ClickHouse не тормозит
Dmitry
но могу дать не менее абстрактный совет как-то готовить данные в отдельные таблички, чтобы селект делал меньше работы
хорошая идея, начал думать в этом направлении, спасибо
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
>GROUP BY по 3 полям
если получается на выходе много строк, то тут ничего удивительного нет.

select number%10003 g, avg(number) from numbers_mt(1000000000) group by g format Null
Elapsed: 0.462 sec

select number%10003 g, number%103 k, avg(number) from numbers_mt(1000000000) group by g, k format Null
Elapsed: 16.653 sec
источник

KL

Kamiλ Liberal-free in ClickHouse не тормозит
на выходе 3 значения также
источник