@clickhouse_ru

Страница 182 из 723
Maksim
23.06.2017
17:11:24
у нас критическая сейчас проблема. таблица свалка вешает сервак и отвечает на запрос пол минуты, когда нужно проагрегировать куча столбцов сортировками и группировками

я уже ничего не вставлял, там репликации кажись чото шуршали :) вьюх было 5 штук, а на серверах по 128ГБ :)
я подозреваю что материализация вьюхи это не вставка в другую таблицу а забитый запрос

сказали что вьюха называется test и у неё такой-то запрос. или как эта штука работает

Alexander
23.06.2017
17:15:34
суть в том, что в таблице было что-то в районе 40 лярдов строк, данные не добавлялись. КХ сервера поднимались, выжирали всю память, падали, снова поднимались и так по веселому кругу

Google
Maksim
23.06.2017
17:17:31
значит надо вставки делать голые в разные таблицы

papa
23.06.2017
17:20:49
а зачем вам таблицы с разным набором колонок, если у вас колоночная база.

Maksim
23.06.2017
17:22:30
потому что кх не справляется с 600 млн таблицей

select toDate(eventTime) as period, toStringCutToZero(country) as country, toStringCutToZero(region) as region, toStringCutToZero(city) as city, toStringCutToZero(gender) as gender, toString(applicationName) as app, age as group_age, SUM(requests_count) AS requests from `audience_statistic_segments` where `eventTime` between '2017-05-21 00:00:00' and '2017-06-19 23:59:59' group by `period`, `country`, `region`, `city`, `gender`, `app`, `group_age` order by `period` asc, `country` asc, `region` asc, `city` asc, `gender` asc, `app` asc, `group_age` asc

вешает сервак и время ответа на этот запрос 55 сек в среднем

Maksim
23.06.2017
17:23:52
если сделать нормализацию и вынести строки в словари. будет ли существенный прирост скорости?

papa
23.06.2017
17:24:45
и читаться колонки будут более короткие.

Andrey
23.06.2017
17:25:52
если сделать нормализацию и вынести строки в словари. будет ли существенный прирост скорости?
посмотрите во что упирается сервер. В диск\память. Но нормализация судя то названиям столбцов нужна

papa
23.06.2017
17:26:45
а какой у вас тип у country, region, итд. сейчас и какие там значения. вы на каждое чтение в каждом запросе что-то с ними делаете. это явно не ускоряет запрос, пишите данные сразу так, чтобы их можно было читать нормально.

и почитайте документацию про view.

Google
Alexey
23.06.2017
17:48:12
вешает сервак и время ответа на этот запрос 55 сек в среднем
А что конкретно значит "вешает сервак"? Посмотрите top -d0.5 dstat iostat -dmx 1 sudo perf top во время выполнения запроса.

Maksim
23.06.2017
17:58:21
Вы про нормализацию?

а какой у вас тип у country, region, итд. сейчас и какие там значения. вы на каждое чтение в каждом запросе что-то с ними делаете. это явно не ускоряет запрос, пишите данные сразу так, чтобы их можно было читать нормально.

View жрет много памяти может это не мой вариант, упирется в ситуацию выше

perf top не стоит на сервере

Vladimir
23.06.2017
18:31:12
perf top не стоит на сервере
Поставь :) linux-tools по-моему пакет

Maksim
23.06.2017
18:38:41








Сорри за большое количество скринов

Виктор
23.06.2017
18:40:25
Декомпрессия

Возвращаюсь к вопросу выше - типы данных в студию

а какой у вас тип у country, region, итд. сейчас и какие там значения. вы на каждое чтение в каждом запросе что-то с ними делаете. это явно не ускоряет запрос, пишите данные сразу так, чтобы их можно было читать нормально.

create table покажи, хотя бы кусок где описаны типы которые в запросе

Google
Виктор
23.06.2017
18:46:57
А. Ну, не надо так делать :)

Anton
23.06.2017
18:58:02
IP хранить лучше, как UInt32 или String?

Igor
23.06.2017
18:58:26
если ipv4, то uint32, если ipv6, то fixedstring(16)

хранить в строке конечно удобнее, но оперативки и времени будет жраться соответствующе. если не жалко и очень лень делать IPvXNumToString - то можно и строками Ну вы можете попробовать сделать две таблички с разными форматами и потестить запросы, может там изменилось чего в производительности за полгода или у вас кейсы другие)

Anton
23.06.2017
19:01:29
спасибо большое за ответ, остановлюсь на числах

Maksim
23.06.2017
19:02:44
Сорри я за рулём

Там строки

Александр
23.06.2017
19:04:00
Раз такая возня, кто-то в курсе можно ли запросом посчитать средне арифметическое по дереву? Снизу вверх

Может формула какая есть? )

С листьев берутся значения и вверх по структуре считается

papa
23.06.2017
19:04:45
оО

Александр
23.06.2017
19:04:59
:) да, звучит дико )

papa
23.06.2017
19:05:00
а как у вас это дерево хранится

Александр
23.06.2017
19:07:35
Таблица где parent_id указан

Лежит в mysql

Можно как угодно переделать

papa
23.06.2017
19:08:51
иерархических запросов нет, так что если и можно, то это будет интересно

Maksim
23.06.2017
19:09:16
Мне никто не подскажет?(

Igor
23.06.2017
19:09:37
Строки там в основном

А. Ну, не надо так делать :)

Google
Александр
23.06.2017
19:11:28
Если чего придумаю - дам знать :)

Vladimir
23.06.2017
19:11:46
Мне никто не подскажет?(
Избавляйся от строк и будет тебе счастье.

Maksim
23.06.2017
19:12:27
Через словари?

Александр
23.06.2017
19:13:16
Ну словарь подключен, иерархия есть

Просто я беру прогресс по листьям

И мне надо вверх по дереву посчитать прогресс по листьям

papa
23.06.2017
19:13:47
Леша сейчас тоже в некотором смысле за рулем, чуть позже может посмотрит в картинки.

Maksim
23.06.2017
19:14:57
Спасибо вам) буду ждать

papa
23.06.2017
19:17:18
ну так если иерархия есть, то ее надо разджойнить, для листьев, получится связка лист - некий родитель, группировать по родителю суммировать числа

Александр
23.06.2017
19:18:16
Структура глубокая, в 4 уровня. Надо попробовать

Сергей
23.06.2017
19:23:38
вы тут все наркоманы

?

Александр
23.06.2017
19:24:08
вы тут все наркоманы
Люди творческие :)

Сергей
23.06.2017
19:24:22
и не говорите

не чат читаю как детективный роман

Maksim
23.06.2017
19:25:42
?

Александр
23.06.2017
20:01:02
Блин...не получится со структурой в запросе ) У меня там еще дата прокидывается. Есть эвент прохождения задания. Структура используется как логическая группировка заданий. Прогресс прохождения, например подраздела - сумма прогресса по заданиям / кол-во заданий, ну и у раздела сумма прогресса подразделов / кол-во подразделов. И получается, что дата прохождения подраздела - дата завершения последнего задания в подразделе.

Короче мутная схема. Приходится выбирать все эвенты из БД и в коде по дереву пробегаться )

Igor
23.06.2017
21:25:06
а нормальная ли практика (и возможно ли вообще) в MATERIALIZED колонке таблицы читать данные из внешнего словаря?

Александр
23.06.2017
21:25:49
Интересный вопрос, кстати :)

Google
Igor
23.06.2017
21:42:46
спасибо. протестирую отпишусь.

Alexey
23.06.2017
21:43:05
Спасибо вам) буду ждать
1. Непонятно, зачем используется функция toStringCutToZero.

toDate(eventTime) as period, - столбец с датой-временем обычно тяжелее, чем просто с датой. А MergeTree требует, чтобы был отдельный столбец с датой. Наверное, можно написать: eventDate as period,

country, region, city можно сделать числами gender тем более.

Вместо трёх столбцов country, region, city можно сделать один - region_id - число, идентификатор региона самого нижнего уровня (город, деревня). Отдельно подключить справочник с иерархией регионов. https://clickhouse.yandex/docs/en/functions/ym_dict_functions.html?highlight=regiontocity

https://clickhouse.yandex/docs/en/dicts/internal_dicts.html

where eventTime between '2017-05-21 00:00:00' and '2017-06-19 23:59:59' Для MergeTree требуется, чтобы кроме условия на первичный ключ, было ещё условие на ключ даты. Это влияет на пропуск ненужных кусков данных при чтении. Оно не может быть выведено автоматически из условия на eventTime. А в конкретном случае видно, что можно оставить условие только на eventDate.

А ещё не помешает посмотреть вывод: SELECT * FROM system.parts WHERE active AND table = 'audience_statistic_segments' SELECT * FROM system.columns WHERE table = 'audience_statistic_segments' cat /proc/cpuinfo

Alexey
24.06.2017
12:11:07
Коллеги, что-то сломал всю голову. Вдруг подскажете что-то этакое. В общем есть необходимость значения получаемые в WITH TOTALS использовать в вычислениях в SQL. Какие есть тут варианты?

надо посчитать долю каждой размерности от общего

т.е. есть хочется что-то вроде SELECT LAC, count()/<total> FROM table GROUP BY LAC

Mikhail
24.06.2017
13:45:26
может так SELECT LAC, cnt/total_cnt FROM (SELECT 1 t LAC, count() cnt FROM table GROUP BY LAC) ALL INNER JOIN (SELECT 1 t count() total_cnt FROM table) USING t

Alexey
24.06.2017
15:22:59
хотелось бы обойтись одним проходом по таблице. Ибо данных хватает в первой выборке. И на стороне приложения такое посчитать можно (и, как я понял модификатор WITH TOTALS делаем именно так).

Artem
24.06.2017
15:34:03
Коллеги, а на что стоит смотреть в первую очередь, когда CH кушает всю оперативку при очень не большой нагрузке. С чего стоит начать?

Страница 182 из 723