Size: a a a

ClickHouse не тормозит

2020 June 15

DT

Dmitry Titov in ClickHouse не тормозит
Vladimir Bunchuk
Спасибо! Как раз только что попробовал увеличить размер блока. И все завелось как надо.

Учитывая что мне подобные запросы нужно делать раз в день по крону для агрегаций, достаточно ли обойтись увеличенным размером блока? Или все же стоит переписывать на массивы?
ну тут все зависит от того сколько записей придет, безгранично увеличивать размер блока не получится.
И максимальный размер блока задается же на весь запрос, а не определенный этап, что тоже не очень удобно.
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Dmitry Titov
ну тут все зависит от того сколько записей придет, безгранично увеличивать размер блока не получится.
И максимальный размер блока задается же на весь запрос, а не определенный этап, что тоже не очень удобно.
на данный момент обрабатываю 26млн записей за раз
могу предположить что за год это количество может увеличиться до 100млн (это с большим запасом)
источник

DT

Dmitry Titov in ClickHouse не тормозит
Vladimir Bunchuk
на данный момент обрабатываю 26млн записей за раз
могу предположить что за год это количество может увеличиться до 100млн (это с большим запасом)
Ну тут в чем дело, размер блока в 65к выбран был не просто так, это является оптимальным соотношением по дроблению данных по ядрам цпу, требуемой памяти и тд.
При необходимости для некоторых запросов увеличение и уменьшение имеет смысл, но в разумных пределах, те грубо говоря не стоит делать размер блока больше сотен тысяч-миллиона строк
источник

DT

Dmitry Titov in ClickHouse не тормозит
в таком случае скорее всего придется как то ухищряться с массивами(причем массив на млн записей тоже так себе идея)
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Alexander Ryzhenko
Доброго дня, подскажите, почему может быть различие в поведении toDateTime() в разных версиях КХ?


Connected to ClickHouse server version 19.15.3 revision 54426.
:) select toDateTime('1970-01-01 00:00:01');
┌─toDateTime('1970-01-01 00:00:01')─┐
│               1970-01-01 00:00:01 │
└───────────────────────────────────┘
1 rows in set. Elapsed: 0.079 sec.
------------------------------------------
Connected to ClickHouse server version 20.3.8 revision 54433.
ClickHouse client version is older than ClickHouse server. It may lack support for new features.
:) select toDateTime('1970-01-01 00:00:01');
┌─toDateTime('1970-01-01 00:00:01')─┐
│               2106-02-07 06:28:17 │
└───────────────────────────────────┘
1 rows in set. Elapsed: 0.086 sec.
select timezone() в обоих? Кх начал использовать переменную TZ в 19...
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Dmitry Titov
Ну тут в чем дело, размер блока в 65к выбран был не просто так, это является оптимальным соотношением по дроблению данных по ядрам цпу, требуемой памяти и тд.
При необходимости для некоторых запросов увеличение и уменьшение имеет смысл, но в разумных пределах, те грубо говоря не стоит делать размер блока больше сотен тысяч-миллиона строк
Принял. Спасибо большое!
Помониторим как будет работать с увеличенным блоком данных.
источник

DT

Dmitry Titov in ClickHouse не тормозит
Vladimir Bunchuk
Принял. Спасибо большое!
Помониторим как будет работать с увеличенным блоком данных.
а ты сколько поставил если не секрет?
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
100млн
источник

DT

Dmitry Titov in ClickHouse не тормозит
ух, а как выглядит запрос то?
(и можно размер блока задавать на определенный запрос а не для всех)
источник

AR

Alexander Ryzhenko in ClickHouse не тормозит
ClickHouse server version 19.15.3: UTC
ClickHouse server version 20.3.8: Europe/Berlin

Понятно. Спасибо
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Dmitry Titov
ух, а как выглядит запрос то?
(и можно размер блока задавать на определенный запрос а не для всех)
SELECT owner_id,
      ts,
      if((owner_id != neighbor(owner_id, 1)) OR (user_agent != neighbor(user_agent, 1)), 0,
         neighbor(ts, 1)) AS LEAD,
      platform_id,
      user_agent,
      operation
FROM (
        SELECT owner_id,
               ts,
               platform_id,
               user_agent,
               date,
               operation
        FROM events
        WHERE (operation LIKE 'app_pageview_%')
          AND (date = '2020-06-07')
          AND ((ts >= 1591488000000) AND (ts <= 1591574399000))
        ORDER BY owner_id ASC,
                 user_agent ASC,
                 ts ASC
        ) AS events
        INNER JOIN
    (
        SELECT *
        FROM (
              SELECT owner_id,
                     platform_id,
                     user_agent,
                     min(ts) AS MIN
              FROM events
              WHERE (operation LIKE 'app_pageview_%')
                AND (date = '2020-06-07')
                AND ((ts >= 1591488000000) AND (ts <= 1591574399000))
              GROUP BY owner_id,
                       platform_id,
                       user_agent
              ORDER BY owner_id ASC,
                       user_agent ASC
                 )
        ORDER BY owner_id ASC,
                 user_agent ASC
        ) AS min_events
    ON (min_events.owner_id = events.owner_id) AND (min_events.platform_id = events.platform_id) AND
       (min_events.user_agent = events.user_agent)
WHERE ((ts >= 1591488000000) AND (ts <= 1591574399000))
 AND (date = '2020-06-07')
 AND (operation LIKE 'app_pageview_%')
ORDER BY owner_id ASC,
        user_agent ASC,
        ts ASC;
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Dmitry Titov
ух, а как выглядит запрос то?
(и можно размер блока задавать на определенный запрос а не для всех)
Выглядит как-то так.
Этот запрос в рамках уникальной сессии будет выполняться раз в день. Так что думаю в перфоманс мы не сильно упремся.
источник

DT

Dmitry Titov in ClickHouse не тормозит
if((owner_id != neighbor(owner_id, 1)) OR (user_agent != neighbor(user_agent, 1)), 0,
         neighbor(ts, 1)) AS LEAD,
грубо говоря мы хотим получить следующий ts для определенного owner_id?
сколько различных owner_id? и сколько примерно для каждого из них записей попадает в запрос?
источник

DT

Dmitry Titov in ClickHouse не тормозит
вообще навскидку это гораздо проще решается через массив и мы тогда с чистой совестью выбрасываем этот ужасный джоин
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Dmitry Titov
if((owner_id != neighbor(owner_id, 1)) OR (user_agent != neighbor(user_agent, 1)), 0,
         neighbor(ts, 1)) AS LEAD,
грубо говоря мы хотим получить следующий ts для определенного owner_id?
сколько различных owner_id? и сколько примерно для каждого из них записей попадает в запрос?
15млн+ овнеров )
источник

DT

Dmitry Titov in ClickHouse не тормозит
ну те массивы будут мелкими, ок
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
количество записей под них варьируется
от нуля до пары-тройки сотен
источник

DT

Dmitry Titov in ClickHouse не тормозит
MIN нигде не используется? судя по всему
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Dmitry Titov
MIN нигде не используется? судя по всему
Он будет еще использоваться дальше.
Этот запрос, что я сбросил — является подзапросом другого запроса. Просто в конечном результате видел ошибки и начал копать вглубь проверяя что пошло не так. Докопался до пробоемы в neighbor, вот про нее и спросил )
источник

DT

Dmitry Titov in ClickHouse не тормозит
SELECT  owner_id,
       platform_id,
       user_agent,
     a.1 as ts,
   a.2 as operation,
   LEAD,
   MIN
FROM(
        SELECT owner_id,
                     platform_id,
                     user_agent,
                     min(ts) AS MIN
           arraySort((x->x.1),groupArray((ts,operation)) as ts_operations,
           arrayPushBack(arrayPopFront(ts_operations.1),0) as next_ts
              FROM events
              WHERE (operation LIKE 'app_pageview_%')
                AND (date = '2020-06-07')
                AND ((ts >= 1591488000000) AND (ts <= 1591574399000))
              GROUP BY owner_id,
                       platform_id,
                       user_agent
              ORDER BY owner_id ASC,
                       user_agent ASC
)
ARRAY JOIN ts_operations AS a,next_ts AS LEAD
источник