Size: a a a

ClickHouse не тормозит

2020 May 29

ИТ

Игорь Трофимов... in ClickHouse не тормозит
Al T
BitmapXor ?
Гляну спасибо
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Dmitry Titov
Только непонятно откуда.
поле не участвует ни в PARTITION KEY, не в ORDER BY
это enum сжат LZ4.
Единственная зацепка, что только сегодня начали записываться значения отличные от 1
Но, я не помню, что бы где то писалось, что кликхаус сам по себе хранит minmax для всех полей
Разве, что он так быстро прочитал mark кеш.
так КХ и не хранит, тут ничего такого нет, наверняка на диске несколько гигабайт, после разжатия они превратились в сотни

SELECT count()
FROM numbers_mt(10000000000)

┌─────count()─┐
│ 10000000000 │
└─────────────┘

1 rows in set. Elapsed: 0.232 sec. Processed 10.00 billion rows, 80.00 GB (43.09 billion rows/s., 344.72 GB/s.)
источник

DT

Dmitry Titov in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
так КХ и не хранит, тут ничего такого нет, наверняка на диске несколько гигабайт, после разжатия они превратились в сотни

SELECT count()
FROM numbers_mt(10000000000)

┌─────count()─┐
│ 10000000000 │
└─────────────┘

1 rows in set. Elapsed: 0.232 sec. Processed 10.00 billion rows, 80.00 GB (43.09 billion rows/s., 344.72 GB/s.)
ну речь не про скорость поднятия с диска, а про скорость сканирования с применением условия.
Но это 4 сервера. те примерно совпадает с вашим запросом.
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
create table X( A Int8 ) Engine = MergeTree order by tuple();
insert into X select 1 from numbers_mt(10000000000)

select count() from X where A = 25;
0 rows in set. Elapsed: 0.326 sec. Processed 10.00 billion rows, 10.00 GB (30.70 billion rows/s., 30.70 GB/s.)

set max_threads=1
select count() from X where A = 25;
0 rows in set. Elapsed: 2.294 sec. Processed 10.00 billion rows, 10.00 GB (4.36 billion rows/s., 4.36 GB/s.)
источник

DT

Dmitry Titov in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
create table X( A Int8 ) Engine = MergeTree order by tuple();
insert into X select 1 from numbers_mt(10000000000)

select count() from X where A = 25;
0 rows in set. Elapsed: 0.326 sec. Processed 10.00 billion rows, 10.00 GB (30.70 billion rows/s., 30.70 GB/s.)

set max_threads=1
select count() from X where A = 25;
0 rows in set. Elapsed: 2.294 sec. Processed 10.00 billion rows, 10.00 GB (4.36 billion rows/s., 4.36 GB/s.)
ну те кликхаус при отсутствии затрат на поднятие данных с диска, может сканировать записи с скоростью ~4 млрд на 1 поток.
буду знать:)
источник

EG

Eduard Generalov in ClickHouse не тормозит
Eduard Generalov
Привет всем.

Можно ли заставить clickhouse падать на ошибке коннекта с zookeeper-ом?
UP.
источник

K

Kos in ClickHouse не тормозит
Доброго времени суток. подскажите , пожалуйста , что я делаю не так.
есть тестовый сервер. 10.0.0.1 на нем установил два кликхауза и zookeeper,
в конфиг первого КХ добавил
/etc/clickhouse-server/config.xml
<zookeeper>
   <node>
       <host>10.0.0.1</host>
       <port>2181</port>
   </node>
</zookeeper>
<macros>
   <replica_group>01</replica_group>
   <replica>server1</replica>
</macros>

и пытаюсь создать таблицу
CREATE TABLE test_repl
(
    id UInt32,     name String
)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{replica_group}/test_repl', '{replica}')
ORDER BY id
и мне выдает  DB::Exception: Can't create replicated table without ZooKeeper
источник

A

Andrey in ClickHouse не тормозит
Kos
Доброго времени суток. подскажите , пожалуйста , что я делаю не так.
есть тестовый сервер. 10.0.0.1 на нем установил два кликхауза и zookeeper,
в конфиг первого КХ добавил
/etc/clickhouse-server/config.xml
<zookeeper>
   <node>
       <host>10.0.0.1</host>
       <port>2181</port>
   </node>
</zookeeper>
<macros>
   <replica_group>01</replica_group>
   <replica>server1</replica>
</macros>

и пытаюсь создать таблицу
CREATE TABLE test_repl
(
    id UInt32,     name String
)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{replica_group}/test_repl', '{replica}')
ORDER BY id
и мне выдает  DB::Exception: Can't create replicated table without ZooKeeper
Сервер рестартовали?
источник

K

Kos in ClickHouse не тормозит
Andrey
Сервер рестартовали?
убит! спасибо огромное!  
я прочитал до этого, что КХ перечитывает конфиг сам при изменении...
4 часа стучался лбом в стену, которой не было.
источник

A

Andrey in ClickHouse не тормозит
Kos
убит! спасибо огромное!  
я прочитал до этого, что КХ перечитывает конфиг сам при изменении...
4 часа стучался лбом в стену, которой не было.
Не весь)
источник
2020 May 30

D

Dmitry Koreckiy in ClickHouse не тормозит
Всем привет!
Есть таблица с динамикой и два запроса от фронта:
1) показать динамику + значение за 12 месяцев по месяцам [ currentMonth - 12, currentMonth - 1 ]
2) показать динамику + значение за прошлый месяц по дням

* значение = sum(prev.delta) + sum(current.delta)

Исходя из того что значение на конкретный день получается суммой всех прошлых + текущее использую runningAccumulate.

Исходной таблица MergeTree:

CREATE TABLE dynamic (
 `_id` String,
 `date` DateTime,
 `delta` UInt64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY
 (_id, date) SETTINGS index_granularity = 8192

На исходной таблице dynamic, если верить табиксу, получаются такие затраты:

0.01 sec.| 407,073 rows.| 14 MB

При том что размер самой таблицы 16793961 rows
И для конкретного _id +- 152 rows

Не смотря на то, что время выполнения огонь и 14мб не ощущаются на сервере с 252 рам, решил все же улучшить.

Для решения решил оставить dynamic как таблицу с исходными данными и аггрегировать их в таблице с движком SummingMergeTree.

CREATE TABLE test_dynamic_sum (
 `_id` String,
 `date` Date,
 `delta` Int64
) ENGINE = SummingMergeTree()
PARTITION BY toStartOfYear(date)
PRIMARY KEY _id
ORDER BY
 (_id, multiIf(date < toStartOfMonth(addMonths(today(), -12)), toStartOfYear(date),date < toStartOfMonth(addMonths(today(), -1)), toStartOfMonth(date), toDate(date)))
SETTINGS index_granularity = 128;

Залил в нее тестовых данных:
- уникальных _id 1000000
- на каждый день в промежутке [2018-01-01,2020-12-31] для каждого _id создал запись
Получилось общее количество записей: 1096000000
Каждый _id имеет: 1096 rows

Опять же, если верить табиксу, то затраты стали такими:

0.00 sec.| 1,537 rows.| 25 KB


Вопросы:

1) Как правильно расчитать index_granularity ?
В test_dynamic_sum расчитывал его как сумма дней за два месяца (31+31) + немного с запасом
2) ORDER BY в test_dynamic_sum схлопывает данные так как я и хотел, но не #банет ли?
Слишком уж идеальный результат получился
источник

D

Dmitry Koreckiy in ClickHouse не тормозит
Сам запрос которым получаю итоговый результат:

WITH
   toDate('2020-05-30') AS currentDate,
   toStartOfMonth(addMonths(currentDate, -1)) AS endOfYear,
   toStartOfMonth(addMonths(currentDate, -12)) AS startOfYear
SELECT
   _date AS date,
   value
FROM (
   SELECT
       date AS _date,
       runningAccumulate(sumState(delta)) AS value
   FROM (
       WITH
           toDate('2020-05-30') AS currentDate,
           toStartOfMonth(currentDate) AS currentMonth
       SELECT
           arrayJoin(arrayMap(x -> addMonths(currentMonth, -1 * x), range(12))) AS date,
           0 AS delta
       UNION ALL
       SELECT
           toStartOfMonth(date) AS date,
           delta
       FROM test_dynamic_sum final
       WHERE _id = '1045'
   )
   GROUP BY date
)
WHERE date >= startOfYear AND date <= endOfYear
ORDER BY date
источник

DT

Dmitry Titov in ClickHouse не тормозит
Dmitry Koreckiy
Всем привет!
Есть таблица с динамикой и два запроса от фронта:
1) показать динамику + значение за 12 месяцев по месяцам [ currentMonth - 12, currentMonth - 1 ]
2) показать динамику + значение за прошлый месяц по дням

* значение = sum(prev.delta) + sum(current.delta)

Исходя из того что значение на конкретный день получается суммой всех прошлых + текущее использую runningAccumulate.

Исходной таблица MergeTree:

CREATE TABLE dynamic (
 `_id` String,
 `date` DateTime,
 `delta` UInt64
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY
 (_id, date) SETTINGS index_granularity = 8192

На исходной таблице dynamic, если верить табиксу, получаются такие затраты:

0.01 sec.| 407,073 rows.| 14 MB

При том что размер самой таблицы 16793961 rows
И для конкретного _id +- 152 rows

Не смотря на то, что время выполнения огонь и 14мб не ощущаются на сервере с 252 рам, решил все же улучшить.

Для решения решил оставить dynamic как таблицу с исходными данными и аггрегировать их в таблице с движком SummingMergeTree.

CREATE TABLE test_dynamic_sum (
 `_id` String,
 `date` Date,
 `delta` Int64
) ENGINE = SummingMergeTree()
PARTITION BY toStartOfYear(date)
PRIMARY KEY _id
ORDER BY
 (_id, multiIf(date < toStartOfMonth(addMonths(today(), -12)), toStartOfYear(date),date < toStartOfMonth(addMonths(today(), -1)), toStartOfMonth(date), toDate(date)))
SETTINGS index_granularity = 128;

Залил в нее тестовых данных:
- уникальных _id 1000000
- на каждый день в промежутке [2018-01-01,2020-12-31] для каждого _id создал запись
Получилось общее количество записей: 1096000000
Каждый _id имеет: 1096 rows

Опять же, если верить табиксу, то затраты стали такими:

0.00 sec.| 1,537 rows.| 25 KB


Вопросы:

1) Как правильно расчитать index_granularity ?
В test_dynamic_sum расчитывал его как сумма дней за два месяца (31+31) + немного с запасом
2) ORDER BY в test_dynamic_sum схлопывает данные так как я и хотел, но не #банет ли?
Слишком уж идеальный результат получился
тебе нужно доставать для конкретного id  только?
источник

DT

Dmitry Titov in ClickHouse не тормозит
multiIf(date < toStartOfMonth(addMonths(today(), -12)), toStartOfYear(date),date < toStartOfMonth(addMonths(today(), -1))
кликхаус скорее всего не сможет использовать эту часть PK для исключения гранул
источник

D

Dmitry Koreckiy in ClickHouse не тормозит
Dmitry Titov
multiIf(date < toStartOfMonth(addMonths(today(), -12)), toStartOfYear(date),date < toStartOfMonth(addMonths(today(), -1))
кликхаус скорее всего не сможет использовать эту часть PK для исключения гранул
я поэтому PK задал отдельно в PRIMARY KEY секции:

PRIMARY KEY _id
источник

D

Dmitry Koreckiy in ClickHouse не тормозит
источник

DT

Dmitry Titov in ClickHouse не тормозит
я бы на самом деле не заморачивался с таким условием в ORDER BY и сделал бы через UNION двух таблиц с TTL
источник

DT

Dmitry Titov in ClickHouse не тормозит
runningAccumulate удобная фунция, но она сбрасывается каждый блок
источник

E

Eugene in ClickHouse не тормозит
О мудрейшие. Доступна ли в кх функциональность по написанию своих функций, точки расширения (плагины) и подобное?
источник

DT

Dmitry Titov in ClickHouse не тормозит
щас пилят возможность UDF
но желающие могут уже попробовать накостылять через cache словарь.
источник