Size: a a a

ClickHouse не тормозит

2020 August 18

AK

Andrii Kakoichenko in ClickHouse не тормозит
Artem Zuikov
в двух словах. hash join хорошо ложится на пайплайн CH поэтому в части join-а там все параллелится примерно так же хорошо, как для обычных запросов. в части построения хэш-таблицы - можно улучшить, если сделать лок-фри хэш таблицу (сейчас там mutex на вставке). merge join-ы вписываются в пайплайн сильно хуже, но там можно и нужно прокинуть инфу о сортировке из таблиц (и возможно где-то начнет обгонять hash join, когда умещаемся в память - не сильно приоритетно), join на диске вписывается очень плохо и сильно тормозит. сейчас join на диске есть только для merge join-а. в этом месте планируется сделать grace hash join (это двухуровневый hash join со скидыванием бакетов на диск) - должно работать сильно лучше текущего join-а на диске. На многопоточность это все почти никак не влияет. Основная проблема join-а на диске не гонять данные с диска в память и обратно (и  не блокироваться на ожидании этих данных).

помимо этого есть еще несколько оптимизаций про join-ы вообще, независимо от алгоритма. Там тоже не про многопоточность, а про использование доп знаний из индекса таблицы.
Спасибо, то есть, если RAM хватает, то должно все ресурсы занимать и делать эффективно?
источник

AZ

Artem Zuikov in ClickHouse не тормозит
Andrii Kakoichenko
Спасибо, то есть, если RAM хватает, то должно все ресурсы занимать и делать эффективно?
да, но из оптимизаций сейчас только push down предикатов из WHERE. Там можно больше выжать, чтобы не сканить все данные
источник

AK

Andrii Kakoichenko in ClickHouse не тормозит
Почему тогда у автора сообщения выше только половина ядер? Памяти не хватило?
источник

AZ

Artem Zuikov in ClickHouse не тормозит
+ есть оптимизация join-ов об словать, если надо не очень много данных из правой таблицы - полезно
источник

AZ

Artem Zuikov in ClickHouse не тормозит
Andrii Kakoichenko
Почему тогда у автора сообщения выше только половина ядер? Памяти не хватило?
там какое-то ожидание на cond_var-е по флеймграфу, с точки зрения join-ов снаружи. надо issue с данными и разбираться, чего ждем
источник

AK

Alexander Kuzmenkov in ClickHouse не тормозит
lnuynxa
Ну плавает ок 12-16 из 32, но там расжатие же еще и тд.
Почти половина flamegraph это wait
Но это относится к multiple join
Как построен этот флеймграф -- семплирование по реальному времени, сумма для всех потоков? Само по себе большое количество ожиданий в трейсах это не показатель плохого использования CPU, просто из-за особенностей реализации м.б. много потоков (заметно больше чем ядер), которые чего-то ждут.
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
проблема в правой таблице (создании хеша)

create table t1 (f0 UInt64, f1 UInt64, f2 Float64, f3 UInt64) Engine=MergeTree order by f0;
insert into t1 select number, number, number/4345345, intDiv(number,4345345) from numbers(50000000);

set max_threads=1
select t.f0, t.f3, s.* from (select * from t1 limit 1) t asof join t1 s using f0, f2 format Null;
Elapsed: 14.853 sec. Processed 50.00 million rows

set max_threads=16
select t.f0, t.f3, s.* from (select * from t1 limit 1) t asof join t1 s using f0, f2 format Null;
Elapsed: 12.620 sec. Processed 50.00 million rows

select t.f0, t.f3, s.* from t1 t asof join t1 s using f0, f2
Elapsed: 14.174 sec. Processed 100.00 million rows
источник

AK

Alexander Kuzmenkov in ClickHouse не тормозит
Alexander Kuzmenkov
Как построен этот флеймграф -- семплирование по реальному времени, сумма для всех потоков? Само по себе большое количество ожиданий в трейсах это не показатель плохого использования CPU, просто из-за особенностей реализации м.б. много потоков (заметно больше чем ядер), которые чего-то ждут.
Для оценки использования CPU по логу запросов мб подойдёт UserTimeMicroseconds из ProfileEvents (это сумма времени CPU для всех потоков запроса), делёное на query_duration_ms -- получается как бы эффективное количество потоков.
источник

l

lnuynxa in ClickHouse не тормозит
Alexander Kuzmenkov
Как построен этот флеймграф -- семплирование по реальному времени, сумма для всех потоков? Само по себе большое количество ожиданий в трейсах это не показатель плохого использования CPU, просто из-за особенностей реализации м.б. много потоков (заметно больше чем ядер), которые чего-то ждут.
https://github.com/Slach/clickhouse-flamegraph
настройки дефолтные
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
что поразительно

create table t2 (f0 UInt64, f1 UInt64, f2 Float64, f3 UInt64) Engine=Join(any, left, f0)
insert into t2 select number, number, number/4345345, intDiv(number,4345345) from numbers(50000000);
Elapsed: 4.829 sec. Processed 50.05 million rows
источник

AZ

Artem Zuikov in ClickHouse не тормозит
asof нужно еще отсортировать ключи asof колонки, там hash-таблица, хранящая отсортированный вектор
any left - просто табличка с ключами
источник

AK

Alexander Kuzmenkov in ClickHouse не тормозит
Сложно, я обычно одним sql-запросом рисую. А какой trace_type в итоге получается? По умолчанию там выбраны все, но Real и CPU ведь смешивать нельзя в один флеймграф, не говоря уже про Memory. Или оно отдельные графики для них рисует?
источник

l

lnuynxa in ClickHouse не тормозит
Alexander Kuzmenkov
Сложно, я обычно одним sql-запросом рисую. А какой trace_type в итоге получается? По умолчанию там выбраны все, но Real и CPU ведь смешивать нельзя в один флеймграф, не говоря уже про Memory. Или оно отдельные графики для них рисует?
отдельно
источник

l

lnuynxa in ClickHouse не тормозит
Alexander Kuzmenkov
Для оценки использования CPU по логу запросов мб подойдёт UserTimeMicroseconds из ProfileEvents (это сумма времени CPU для всех потоков запроса), делёное на query_duration_ms -- получается как бы эффективное количество потоков.
2931594673/233800 = 12538 / 1000 = 12.5
источник

AZ

Artem Zuikov in ClickHouse не тормозит
попробуйте построить отдельно для части построения hash-таблицы (join с 0 строк слева), пока гипотеза, что все тормоза там
источник

AK

Andrii Kakoichenko in ClickHouse не тормозит
Скажите ещё, если надо обогатить маленькую таблицу (на 1к строк) при помощи большой (миллиард и более строк), то можно ли заставить СН 1000 раз дернуть данные из большой по PK вместо hash join? И желательно, чтобы это все в параллели
источник

IS

Ivan Solyakin in ClickHouse не тормозит
Всем привет. Про оконные функции на КХ часто спрашивают. Пока команда этот функционал не реализовала. Я написал небольшую статью про эмуляцию оконных функций на КХ. https://habr.com/ru/post/515606/ Буду рад любым конструктивным комментариям.
источник

K

Kos in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
можно и альтером добавить к существующей,  это обычная таблица
я вот сделал TTL  event_date + toIntervalWeek(1), чтоб удалялись данные старше недели.
но по факту ничего не произошло.  или старые данные которые были до применения TTL надо самому удалить?
источник

AZ

Artem Zuikov in ClickHouse не тормозит
Andrii Kakoichenko
Скажите ещё, если надо обогатить маленькую таблицу (на 1к строк) при помощи большой (миллиард и более строк), то можно ли заставить СН 1000 раз дернуть данные из большой по PK вместо hash join? И желательно, чтобы это все в параллели
если ключи уникальны, можно сделать словарь над большой и join об этот словарь. сколько подгрузится из большой таблицы зависит от лэйаута словаря
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Kos
я вот сделал TTL  event_date + toIntervalWeek(1), чтоб удалялись данные старше недели.
но по факту ничего не произошло.  или старые данные которые были до применения TTL надо самому удалить?
зависит от версии КХ , вообще раз в сутки TTL срабатывает, и есть ALTER MATERIALIZE TTL
источник