
Alexey
30.08.2018
15:06:40
Ведь судя по доке: Фрагмент INSERT INTO t VALUES парсится полноценным парсером, а данные (1, 'Hello, world'), (2, 'abc'), (3, 'def') - быстрым потоковым парсером.

Denis
30.08.2018
15:07:06

Nick
30.08.2018
15:10:02
dictGetString('some_dict_name', 'name', tuple(toUInt64(3))) AS rname
Оказывается надо так

Ilyas
30.08.2018
15:10:57

Google

Kirill
30.08.2018
15:13:23

Michal
30.08.2018
15:19:33

Alexey
30.08.2018
15:24:27
Круче всего в RowBinary наверное писать

Alexey
30.08.2018
15:24:37
То есть, OPTIMIZE detached данных нельзя сделать.

Алексей
30.08.2018
15:28:14
Спасибо.

Alexey
30.08.2018
15:28:53
можно наверно во время вставки делать unhex(‘dfdfd45’) ?
В формате Values есть два вида парсера. Один - быстрый потоковый парсер, который работает, если во вставляемых данных нет выражений. Другой - весьма медленный, который интерпретирует выражения.
Вы можете написать выражение unhex(...) при вставке, но работаеть будет медленно.

Vyacheslav
30.08.2018
15:30:53
ну будет медленно, понятно. придется терпеть. вариантов-то нет больше, все равно, так?

Alexey
30.08.2018
15:30:58

Nick
30.08.2018
15:31:38
Нет, не составной

Google


Michal
30.08.2018
15:33:59
ну будет медленно, понятно. придется терпеть. вариантов-то нет больше, все равно, так?
Если там в VALUES только константы - то будет быстро.
Сообщение об ошибке действительно плохое.
➜ cat /tmp/values.txt /tmp/values2.txt | clickhouse-client --query='INSERT INTO tracklog VALUES' -t --stacktrace
Code: 53. DB::Exception: Type mismatch in IN or VALUES section. Expected: UInt64. Got: String
Stack trace:
0. clickhouse-client(StackTrace::StackTrace()+0x16) [0x490b4b6]
1. clickhouse-client(DB::Exception::Exception(std::string const&, int)+0x1f) [0x2686d3f]
2. clickhouse-client() [0x420ce12]
3. clickhouse-client(DB::convertFieldToType(DB::Field const&, DB::IDataType const&, DB::IDataType const*)+0x53) [0x420d353]
4. clickhouse-client(DB::ValuesRowInputStream::read(std::vector<COWPtr<DB::IColumn>::mutable_ptr<DB::IColumn>, std::allocator<COWPtr<DB::IColumn>::mutable_ptr<DB::IColumn> > >&)+0x838) [0x4435c18]
5. clickhouse-client(DB::BlockInputStreamFromRowInputStream::readImpl()+0x75) [0x466a175]
6. clickhouse-client(DB::IProfilingBlockInputStream::read()+0x1fd) [0x3ad697d]
7. clickhouse-client(DB::AsynchronousBlockInputStream::calculate(MemoryTracker*)+0x47) [0x26943b7]
8. clickhouse-client(ThreadPool::worker()+0x167) [0x4a18727]
9. clickhouse-client() [0x4dc4c9f]
10. /lib64/libpthread.so.0(+0x7e25) [0x7f147320ee25]
11. /lib64/libc.so.6(clone+0x6d) [0x7f1472c3a34d]


Alexey
30.08.2018
15:34:20
ну будет медленно, понятно. придется терпеть. вариантов-то нет больше, все равно, так?
Как лучше всего вставлять бинарные данные.
1. Можно использовать формат TSV. Тогда требуется заменять байты - перевод строки 0x0A, таб 0x09, бэкслеш 0x5C на \n, \t, \\. Также рекомендуется (но не обязательно) экранировать \r, \0.
2. Можно использовать формат RowBinary. Он более эффективен для парсинга и не требует экранирования. Строка пишется так: сначала длина строки в формате varint, потом байты строки.

Vyacheslav
30.08.2018
15:35:57
у меня в values unhex встречается

Alexey
30.08.2018
15:36:30

Vyacheslav
30.08.2018
15:36:53
по RowBinary — а как колонки разделяются и как разные типы кодируются? ну там int?

Alexey
30.08.2018
15:37:35
https://clickhouse.yandex/docs/ru/interfaces/formats/#rowbinary

Nick
30.08.2018
15:39:31
<structure>
<key>
<attribute>
<name>id</name>
<type>UInt64</type>
</attribute>
</key>
<attribute>
<name>name</name>
<type>String</type>
<null_value></null_value>
</attribute>
</structure>
да вроде не составной

Alexey
30.08.2018
15:41:38
По поводу сообщения об ошибке:
Type mismatch in IN or VALUES section. Expected: UInt64. Got: String
Скорее всего, значение типа String
(например, unhex('ABCD'))
встречается на позиции того столбца, который имеет тип UInt64.
Было бы хорошо выводить информацию о позиции и имени этого столбца... и о самом значении.
Если есть сомнения, что это сообщение некорректно - просьба поделиться структурой таблицы, несколькими строками данных в качестве примера, и примером, как производится вставка.

Vyacheslav
30.08.2018
15:42:09
а, подумал что это native формат и недокументированю
вставка производилась как insert into table values ()
точная структура и точные значения не сохранились, к сожалению.


Alexey
30.08.2018
15:46:05
1) имеет ли смысл укорачивать длинну ключа, для тех случаев когда там есть длинные id? но они постоянно повторяются. например в начале может быть имя компании - в 99% там будет "yandex"
Сами значения первичного ключа хранятся для каждых N строк таблицы, где N (index_granularity) по-умолчанию - 8192. Обычно это значит, что первичный ключ занимает мало места в оперативке. На скорость фильтрации данных его длина почти не влияет.
Тем не менее, делать очень много столбцов часто бессмысленно. Если они не нужны для сортировки для Collapsing/Replacing/Summing/AggregatingMergeTree, и если последние столбцы не помогают фильтрации, то держать их в первичном ключе не нужно.
Описание того, как работает фильтрация:
https://clickhouse.yandex/docs/ru/operations/table_engines/mergetree/#_4
а, подумал что это native формат и недокументированю
RowBinary - это бинарный формат, в котором данные уложены по строкам. Первая строка, вторая строка, и т. п. Весьма привычно для работы.
Native формат - это бинарный формат, который состоит из блоков, а в каждом блоке данные уложены по столбцам. Менее привычно для использования, и не документировано. Что эффективнее для приложения, которое вставляет данные - это ещё под вопросом, так как само приложение может тратить ресурсы на преобразование в такой формат.


Evgeny
30.08.2018
17:33:40
Подскажите пожалуйста, как лучше сделать? У меня в запросе происходит фильтрация массивов, получается много вложенных arrayFilter и arrayMap, я хочу 9для отладки и лучшего понимания проиходящего) раздзелить из чтобы было так примерно:
SELECT
arrayFilter(..., someval) as r1,
arrayMap(..., r1) as r2,
arrayFilter(..., r2) as result
Не увеличивается ли расход памятит от того что я размазываю много вложенных вызовов в строку? И если да - можно ли делать такие алиасы не в селекте или езе как-то исключить их из выборки?


Alexey
30.08.2018
18:03:04
Подскажите пожалуйста, как лучше сделать? У меня в запросе происходит фильтрация массивов, получается много вложенных arrayFilter и arrayMap, я хочу 9для отладки и лучшего понимания проиходящего) раздзелить из чтобы было так примерно:
SELECT
arrayFilter(..., someval) as r1,
arrayMap(..., r1) as r2,
arrayFilter(..., r2) as result
Не увеличивается ли расход памятит от того что я размазываю много вложенных вызовов в строку? И если да - можно ли делать такие алиасы не в селекте или езе как-то исключить их из выборки?
Расход памяти не увеличивается. Суть в том, что в запросе все одинаковые выражения склеиваются и считаются один раз.
Можно делать такие алиасы не в SELECT-е, а в секции WITH, вот так:
WITH expr AS alias, expr2 AS alias2... SELECT alias, alias2, ...


Evgeny
30.08.2018
18:06:15
они не одинаковые, там r1, r2 и result считаются отдельно для каждой строчки
то есть у меня получается либо
arrayFilter(..., arrayMap(..., arrayFilter(..., someval))) as result
либо так как написано сообщением выше. Меня смущает что в случае вложенных фильтров и мапов после подсчёта результата для каждой строки промежуточные подсчёты можно выкинуть, а случае когда они возращаются - выкинуть их нельзя

Alexey
30.08.2018
18:11:16

Google

Evgeny
30.08.2018
18:14:33
Я вынес эти части в WHERE, получается что-то вроде
SELECT
result
...
WHERE
notEmpty(arrayFilter(..., someval) as r1)
AND notEmpty(arrayMap(..., r1) as r2)
AND notEmpty(arrayFilter(..., r2) as result)
Будет ли эта конструкция вести себя как я ожидаю? Есть ли в ней еще какие-то отрицательные стороны?
по крайней мере я ожидаю что notEmpty должен быть достаточно быстрый чтобы этого практически не было заметно

Alexey
30.08.2018
18:19:34

Evgeny
30.08.2018
18:20:12
Спасибо большое, так действительно лучше!

Alexey
30.08.2018
18:21:29

Evgeny
30.08.2018
18:23:33
Но в секции WITH оно будет высчитываться для каждой строки разве?

Alexey
30.08.2018
18:23:55

Evgeny
30.08.2018
18:23:55
Я был уверен что она считается один раз перед запросом
Ага.. Спасмбоо второй раз
А нет ли более красивого варианта для arrayMap((x,y,z)->(x,y,z),nested.x,nested.y,nested.z) ?

Alexey
30.08.2018
18:40:22

Mike
30.08.2018
19:47:51

Alexey
30.08.2018
19:55:09

Mike
30.08.2018
19:56:17
Кстати, на тему WITH задам дурацкий вопрос
select a, a+1 from t
with a as b select b, b+1 from t
Сколько раз вычислится а? И в том и в другом случае один?

prll
30.08.2018
20:15:57

Alexey
30.08.2018
20:16:25

Tima
30.08.2018
21:37:24
@milovidov_an Скажите пожалуйста, когда ближайший релиз?

Alexey
30.08.2018
21:43:02

Google

Vadim
31.08.2018
04:16:22
Кто-то знает, что может задерживать мутации(ALTER TABLE...DELETE WHERE...)? Висят уже более суток. Мерджи крупные все прошли. Оптимизировать таблицы нужно?

Alexander
31.08.2018
04:44:49


Vadim
31.08.2018
04:49:14
в логах только:
2018.08.30 10:22:12.412130 [ 17 ] <Information> default.graphite_tree (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000008 - 0000000008
2018.08.30 10:22:27.632989 [ 76 ] <Information> default.graphite_tree (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000009 - 0000000009
2018.08.30 10:22:32.639549 [ 17 ] <Information> default.graphite_tree (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000010 - 0000000010
2018.08.30 10:22:41.217139 [ 19 ] <Information> default.graphite_tree (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000011 - 0000000011
2018.08.30 10:22:46.957097 [ 79 ] <Information> default.graphite_tree (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000012 - 0000000012
2018.08.30 10:22:51.736090 [ 11 ] <Information> default.graphite_tree (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000013 - 0000000013
2018.08.30 10:23:24.037055 [ 62 ] <Information> default.graphite (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000008 - 0000000008
2018.08.30 10:23:33.806679 [ 70 ] <Information> default.graphite (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000009 - 0000000009
2018.08.30 10:23:46.449111 [ 76 ] <Information> default.graphite (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000010 - 0000000010
2018.08.30 10:23:52.607061 [ 65 ] <Information> default.graphite (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000011 - 0000000011
2018.08.30 10:23:57.334559 [ 75 ] <Information> default.graphite (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000012 - 0000000012
2018.08.30 10:24:01.898373 [ 81 ] <Information> default.graphite (ReplicatedMergeTreeQueue): Loading 1 mutation entries: 0000000013 - 0000000013
и они до сих пор не выполнились
Первая вообще с 27.08
Хотя прогресс есть, поле parts_to_do снижается у всех мутаций


Alexander
31.08.2018
05:44:56
значит, мутации выполняются
хотя что-то очень медленно. Какой объем партиций?

Vadim
31.08.2018
05:46:18
20-400G

Alexander
31.08.2018
05:46:56
и версия КХ какая? в первых релизах с мутациями была бага - мутации делались даже для тех партиций, в которых нет данных для мутации
такое поведение исправлено только в 18.4.0

Wolf
31.08.2018
05:48:39

Vadim
31.08.2018
05:48:58
18.6.0 54401
да, похоже на то, у всех мутаций в списке партиций - все

Alexander
31.08.2018
05:49:37
хм, в 18.6.0 уже не должно быть такого по идее
только если мутации не были созданы еще до обновления
либо в 18.6 регресс случился
мутации были созданы уже на 18.6?

Vadim
31.08.2018
05:55:52
да, на предудущей(1.54390) я не пробовал удалять данные

Alexander
31.08.2018
05:58:27
https://github.com/yandex/ClickHouse/pull/2694 вот тут вроде поправили, может не до конца...

Konstantin
31.08.2018
06:55:19

Google

Nick
31.08.2018
07:55:01
К xml конфигах clickhouse можно инклюдить другие конфиги или перменные?
допустим для группы словарей общие креды к базе данных, есть смысл вынести их в одно место и подключать во все конфиги словарей

Michal
31.08.2018
09:11:10
Тут пример как у нас сконфигурировано: https://gist.github.com/filimonov/cbafa8ca85268693b7bf28c14473ab34

Nick
31.08.2018
09:19:11
спасибо