
Denis
26.09.2018
20:15:13

Michal
26.09.2018
20:17:10
нет
Хм. Не знал и не пробовал (особо вроде не за чем) но думал что такие каскады возможны.

Google

Kirill
26.09.2018
20:18:09
а зачем?
https://gist.github.com/lanwen/211f5a6dc7a463bdf364099850b8efcc
есть эвент сурсинг над пользователями в виде эвентов. Есть админские вьюхи, чтобы дебажить и есть анонимные, для аналитики которые точные копии админских, ток с хешированными данными. Вот хочется в админских типа текущий стейт накапливать, и потом каждый раз последнюю версию разносить по анонимным
просто на 10 табличках многовато sql выходит
если все аггрегейты из оригинала делать - то конечно работает норм. Но там аля 5к строк sql на всех наших табличках выходит

Michal
26.09.2018
20:27:27
А аналитиков не удовлетворит вариант "нажмите сюда" чтоб у вас появились такие-то данные? И копировать им хэшированные данные "по требованию"?
Без MV. Аналитики обычно любят подолгу мучать какой-то один фрагмент данных, обычно реалтайм им не так важен.

Kirill
26.09.2018
20:32:34
ну там основной прикол что нужно скрыть оригинальные данные как то в анонимной бд, а бэкенду не заморачиваться с кнопкой апдейта данных
и вот ищу способы сделать это за счет CH пока
ну и реалтайм сильно помогает рисовать графички на публичной графане

Alexander
26.09.2018
20:52:22

Denis
26.09.2018
21:11:27

Kirill
26.09.2018
21:12:53

Alexey
26.09.2018
21:50:25

Denis
26.09.2018
22:20:56
без Final там пляшет выдача рандомно - name может быть 2, 3 или 4 в примере если много раз селект без FINAL поделать
?
ну это интересная идея у вас, хранить anyLastState / anyLastMerge, а потом с помощью final случайно видеть стабильный результат напрягая КХ на каждом селекте, вместо того чтобы вычислить один раз с argMaxState? .
наверное хотелось
argMaxState(if(
visitParamHas(event, 'name'),
visitParamExtractString(event, 'name'),
null
), timestamp) AS name
SELECT subjectId,
maxMerge(stateAt) as stateAt,
minMerge(createdAt) as createdAt,
maxMerge(updatedAt) as updatedAt,
argMaxMerge(name) as name FROM lanwen.aggregate
GROUP BY subjectId;

Google

Alexey
27.09.2018
07:21:07
Подскажите пож, если я правильно понимаю, то нелзя сделать arrayJoin нескольких массивов сразу, а мне нужно приджойнить два столбца из двух массивов. Как это можно сделать? Оба столбца джойнятся 1 к 1 - дата заказа и номер заказа.

Алексей
27.09.2018
07:52:16

Alexey
27.09.2018
07:52:49
вроде бы можно
Говорит нельзя, ругается - мол тоглько один аргумент можно.

Алексей
27.09.2018
07:58:29

Tima
27.09.2018
07:59:36

Kirill
27.09.2018
08:24:48

Aleksandr
27.09.2018
08:50:25
привет, подскажите пожалуста, таблицу типа CollapsingMergeTree можно создать новым синтаксисом?
ENGINE CollapsingMergeTree() PARTITION BY toYYYYMM(date) ORDER BY (name, date) SETTINGS index_granularity=8192

Kirill
27.09.2018
08:55:08

Aleksandr
27.09.2018
08:55:28
еще вопрос, я правильно понимаю что в CollapsingMergeTree нельзя пачками (по несколько тысяч) вставлять изменения?

Mike
27.09.2018
08:57:10
предположу, что можно, ничем не отличается от других таблиц в этом плане

Kirill
27.09.2018
09:00:20
Да, ничем от остальных *MergeTree вставка не отличается

Ivan
27.09.2018
09:10:51
А есть какой-то бестпрэктис по миграции тяжелых(овер 2т) табличек?
Кажется что быстрая репликация опасна из-за медленного процесса слияния parts.

Aleksandr
27.09.2018
09:11:55
Да, ничем от остальных *MergeTree вставка не отличается
то есть можно делать такие запросы
insert into sessions values (today(), 'perchik3', 10, 1), (today(), 'perchik3', 10, -1), (today(), 'perchik3', 20, 1), (today(), 'perchik3', 20, -1), (today(), 'perchik3', 30, 1), главное чтобы порядок сохранялся?

Алексей
27.09.2018
09:16:34
то есть можно делать такие запросы
insert into sessions values (today(), 'perchik3', 10, 1), (today(), 'perchik3', 10, -1), (today(), 'perchik3', 20, 1), (today(), 'perchik3', 20, -1), (today(), 'perchik3', 30, 1), главное чтобы порядок сохранялся?
today() будет сильно замедлять вставку

Aleksandr
27.09.2018
09:16:47

Kirill
27.09.2018
09:20:10
то есть можно делать такие запросы
insert into sessions values (today(), 'perchik3', 10, 1), (today(), 'perchik3', 10, -1), (today(), 'perchik3', 20, 1), (today(), 'perchik3', 20, -1), (today(), 'perchik3', 30, 1), главное чтобы порядок сохранялся?
При желании можно, но зачем? )

Aleksandr
27.09.2018
09:20:44
у меня данные вставляются большими пачками по мере накопления
а данные только при вставке схлорываются или с течением времени тоже?

Google

abc
27.09.2018
09:28:14
Подскажите а разве FINAL нельзя использовать в конструкции INSERT INTO SELECT ?

Aleksandr
27.09.2018
09:30:15

Mike
27.09.2018
09:38:57

Aleksandr
27.09.2018
09:41:39
не могу найти в доке про это ничего

Tima
27.09.2018
09:43:50
Так что не стоит ожидать что данные будут консистенты. Чтобы получить итоговое значение, используйте в запросе FINAL (итоговое значение будет только в результате запроса). Но FINAL сильно тормозит запрос, даже если все данные смерджены (слопнуты)

Aleksandr
27.09.2018
09:46:16


Tima
27.09.2018
09:51:49
Всё зависит от данных. как часто появляются дубли и что за запросы. У нас есть часто меняющиеся данные, мы их обновляем раз в минуту. И после вставлки дублей делаем OPTIMIZE (таблица ReplacingMergeTree). Да, в какой-то момент могу быть записи с дублями. Но, в запросах как правило нужны агрегаты, а там мы обычно пишем uniq(id) - т.е. это нивелируется

Wolf
27.09.2018
09:57:21
А можно как то увеличить длину запроса в кх через хттп , а то когда он очень длинный возвращает 400 ответ

Denis
27.09.2018
09:59:14
@stufently клади запрос в body: "You can send the query itself either in the POST body, or in the URL parameter."

Alex
27.09.2018
10:00:01


abc
27.09.2018
10:10:18
Подскажите как корректно обновлять значения счетчика в таблице? Пробую так
CREATE TABLE msg_log (
created_at DateTime DEFAULT now(),
pid String,
psid String,
mid String,
is_delivered UInt8 DEFAULT CAST(0, 'UInt8'),
is_read UInt8 DEFAULT CAST(0, 'UInt8')
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (pid, psid, mid)
SETTINGS index_granularity = 8192;
INSERT INTO msg_log(pid,psid,mid) VALUES('AB','CD','EF');
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, 1, is_read FROM msg_log
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
В итоге при запросе SELECT * FROM msg_log FINAL
ожидаю что is_delivered = 1 и is_read = 1 а по факту вижу только is_read = 1

Тимур
27.09.2018
10:28:04
всем привет, вопрос такой. Как вычесть из текущего элемента массива предыдущий?

Алексей
27.09.2018
10:30:07
SELECT arrayDifference(...)(

Александр
27.09.2018
10:33:33

Алексей
27.09.2018
10:33:42
нет

Александр
27.09.2018
10:34:15
Требуется что-то типа array[2] - array[1]?

Алексей
27.09.2018
10:35:00
SELECT arrayDifference(values)
FROM
(
SELECT [3, -1, -1, -1, -1, -1, 3, -10, 1] AS values
)
┌─arrayDifference(values)─┐
│ [0,-4,0,0,0,0,4,-13,11] │
└─────────────────────────┘

Google

abc
27.09.2018
10:38:15
Подскажите как корректно обновлять значения счетчика в таблице? Пробую так
CREATE TABLE msg_log (
created_at DateTime DEFAULT now(),
pid String,
psid String,
mid String,
is_delivered UInt8 DEFAULT CAST(0, 'UInt8'),
is_read UInt8 DEFAULT CAST(0, 'UInt8')
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (pid, psid, mid)
SETTINGS index_granularity = 8192;
INSERT INTO msg_log(pid,psid,mid) VALUES('AB','CD','EF');
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, 1, is_read FROM msg_log
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
В итоге при запросе SELECT * FROM msg_log FINAL
ожидаю что is_delivered = 1 и is_read = 1 а по факту вижу только is_read = 1
Как я понимаю такие апдейты это не кликхаус вей?

Тимур
27.09.2018
10:38:48
спасибо! я не нашел в документации, только *runningDifference*

Wolf
27.09.2018
11:45:11
а как можно посмотреть идет ли еще процесс удаления в show processlist пусто , часть партиций очистилось ок , мутация на которую попало удаление отмутировалась и появилась новая с удаленными данным, но одна большая партиция осталась в ней должны были удалиться все данные .

M
27.09.2018
11:47:34
в system.mutations
будет признак завершения
is_done и parts_to_do

Wolf
27.09.2018
11:58:08
ага спасибо еще идет значит все ок

Yuran
27.09.2018
11:59:59
Подскажите пожалуйста по поводу настроек RAID:
В документации в https://clickhouse.yandex/docs/ru/operations/tips/ говорится такое:
> Включите NCQ с длинной очередью. Для HDD стоит выбрать планировщик CFQ, а для SSD — noop. Не стоит уменьшать настройку readahead. На HDD стоит включать кеш записи.
Что подразумевается под кешом записи? SSD с writeback? RAID с батарейкой? Но это же означает аппаратный рейд, а чуть выше там рекомендуют mdadm
Спрашиваю потому, что у нас при отностительно невысокой (как мне кажется) нагрузке на чтение в 150 мбайт/сек (наливка новой реплики) начинает существенно деградировать производительность диска. Хотелось бы понять, что с этим можно сделать.

AlexSP
27.09.2018
12:08:05
Коллеги, можно очень общий вопрос по производительности кликхауса. Надо писать около 200 000 метрик в секунду. Размер метрики около 50 байт. На что по железу надо рассчитывать?
10МБ/сек

Wolf
27.09.2018
12:15:09
почти любой подойдет если писать батчем одним раз в секунду

Denis
27.09.2018
12:17:23

Yuran
27.09.2018
12:18:02
write-back caching
то есть барьеры записи того
и данные в теории тоже
но всё равно спасибо


Denis
27.09.2018
12:20:15
скорее всего ваша проблема не в этом, попробуйте померяте iops (с помощью fio) 100% чтения, 100% записи, 80% чтения 20% записи.
Подскажите как корректно обновлять значения счетчика в таблице? Пробую так
CREATE TABLE msg_log (
created_at DateTime DEFAULT now(),
pid String,
psid String,
mid String,
is_delivered UInt8 DEFAULT CAST(0, 'UInt8'),
is_read UInt8 DEFAULT CAST(0, 'UInt8')
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (pid, psid, mid)
SETTINGS index_granularity = 8192;
INSERT INTO msg_log(pid,psid,mid) VALUES('AB','CD','EF');
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, 1, is_read FROM msg_log
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
В итоге при запросе SELECT * FROM msg_log FINAL
ожидаю что is_delivered = 1 и is_read = 1 а по факту вижу только is_read = 1
вам FINAL надо всегда
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, 1, is_read FROM msg_log FINAL
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log FINAL
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log FINAL
:-] WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
┌──────────created_at─┬─pid─┬─psid─┬─mid─┬─is_delivered─┬─1─┐
│ 2018-09-27 12:26:19 │ AB │ CD │ EF │ 1 │ 1 │
└─────────────────────┴─────┴──────┴─────┴──────────────┴───┘
на миллиардах все это не заработает.
вам надо summingmergetree использовать, и только insert ... без всяких селект из самой таблицы


abc
27.09.2018
12:35:04
вам FINAL надо всегда
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, 1, is_read FROM msg_log FINAL
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
INSERT INTO msg_log
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log FINAL
WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
SELECT created_at, pid, psid, mid, is_delivered, 1 FROM msg_log FINAL
:-] WHERE pid = 'AB' AND psid = 'CD' AND mid = 'EF';
┌──────────created_at─┬─pid─┬─psid─┬─mid─┬─is_delivered─┬─1─┐
│ 2018-09-27 12:26:19 │ AB │ CD │ EF │ 1 │ 1 │
└─────────────────────┴─────┴──────┴─────┴──────────────┴───┘
на миллиардах все это не заработает.
вам надо summingmergetree использовать, и только insert ... без всяких селект из самой таблицы
Да я буквально с полчаса назад переписать на SummingMergeTree. Вы правы с постоянными SELECT при вставке получаются неоднозначные результаты

Google

abc
27.09.2018
12:36:08
к тому же на движке SummingMergeTree если в таблице одна запись с полем для суммирования 0, то при SELECT FINAL мы ничего не получаем

Denis
27.09.2018
12:37:28
к SummingMergeTree не надо делать final, т.к. "select sum, sum .... group by" возвращает финальный результат.

Vsevolod
27.09.2018
12:56:58
In file included from /root/rpmbuild/BUILD/ClickHouse-f483e4cb051e0ccb8f3866c609754fce9fa9034f/contrib/zlib-ng/zutil.h:28:0,
from /root/rpmbuild/BUILD/ClickHouse-f483e4cb051e0ccb8f3866c609754fce9fa9034f/contrib/zlib-ng/adler32.c:9:
/root/rpmbuild/BUILD/ClickHouse-f483e4cb051e0ccb8f3866c609754fce9fa9034f/contrib/zlib-ng/zlib.h:1819:66: error: unknown type name 'va_list'
ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va);
никто не сталкивался?
судя по zlib.h/zconf.h stdarg должен включаться всегда

Wolf
27.09.2018
12:57:48
а учитывает кх свободное место при мутациях ?

Ivan
27.09.2018
13:00:16
Привет! Подскажите, есть ли в кликхаусе какой-нибудь механизм ротирования system.query_log?

Denis
27.09.2018
13:02:01

Wolf
27.09.2018
13:02:55
спс , почитаю и посмотрю

I
27.09.2018
13:48:31
Для тех, кто использует Kotlin в связке с КЦ, советую очень интересную либу для облегчения рутины: https://github.com/TanVD/AORM.

Denis
27.09.2018
13:50:35

Ivan
27.09.2018
13:52:43

Kirill
27.09.2018
14:36:43
Попробовал с aggregatingMergeTree - все работает как надо
Есть вопрос по ReplacingMergeTree - почему игнорируется условие WHERE ?
https://gist.github.com/lanwen/206c9aa6740a4f2728c1f88610c55dd6
BTW если кому интересно как вышло с AggregatingMergeTree https://gist.github.com/lanwen/211f5a6dc7a463bdf364099850b8efcc

Tima
27.09.2018
14:46:57

Kirill
27.09.2018
14:47:45
а как это без подзапроса написать?