
Kirill
04.08.2017
10:53:17

Виктор
04.08.2017
12:13:09
Добрый день, ребят можете кто-нибудь помочь как можно узнать статистику по таблице? Вроде того какая колонка больше всего занимает или где запрос тормозит

papa
04.08.2017
12:17:48
select * from system.columns where table = ?

Виктор
04.08.2017
12:20:56
спасибо больоше :)

Google

Диана
04.08.2017
12:33:57
кто-то сталкивался с проблемой, что нужно сложить стринговые айдишники (цифры и буквы) более компактно?
а то уж больно много места отжирают

papa
04.08.2017
12:35:02
фиксированной длины?

Виктор
04.08.2017
12:35:10
Стринговые в плане строка в которой шестнадцатеричные числа
ага
Для примера: 57cc2540558c52333c563a5c

papa
04.08.2017
12:36:21
fixedstring(16)

Vsevolod
04.08.2017
12:36:55
я бы в какой int128 перевел

Виктор
04.08.2017
12:36:56
А не подскажешь пожалйуста чем этот способ лучше?

Vsevolod
04.08.2017
12:37:03
или как он там, uuid

Виктор
04.08.2017
12:37:25
А разве есть такой тип? Я вродде только смотрел. Возможно я что-тто упустил

Fike
04.08.2017
12:37:29
на два инта64 должно биться

Vsevolod
04.08.2017
12:37:44
я видел как минимум pull request с ним

Google

Виктор
04.08.2017
12:38:34
я сейчас поиском по документации прошел и нет такого типа(

Диана
04.08.2017
12:38:44
не задокументировали еще

Виктор
04.08.2017
12:40:23
В любом случае спасибо! Будем пробовать)

Vladimir
04.08.2017
12:42:15
К вопросу что выгоднее int (*1000 например) или float
┌─table────┬─name──┬─type───┬─data_compressed_bytes─┬─data_uncompressed_bytes─┬─marks_bytes─┬──compression_rate─┐
│ measures │ value │ UInt64 │ 929445698 │ 5363178392 │ 1309648 │ 5.770297719964271 │
└──────────────────────┴───────┴────────┴───────────────────────┴─────────────────────────┴─────────────┴───────┘
┌─table────┬─name──┬─type────┬─data_compressed_bytes─┬─data_uncompressed_bytes─┬─marks_bytes─┬──compression_rate─┐
│ measures │ value │ Float32 │ 2518338746 │ 6651819960 │ 3248576 │ 2.641352348076846 │
└──────────┴───────┴─────────┴───────────────────────┴─────────────────────────┴─────────────┴───────────────────┘

Fike
04.08.2017
12:42:38
если у вас хэш, то его вывод на самом деле просто набор байтов, и ничего лучше чем перевести в fixedstring, переведя обратно в реальные байты, нельзя придумать

Vladimir
04.08.2017
12:43:33
Я бы сказал что компрессия работает отлично и пофиг что использовать или нужно мерять на выших данных.
Но однозначно советовать предостерегся бы

Constantine
04.08.2017
12:43:57
,3,000-+

Виктор
04.08.2017
13:04:28
спасибо! Будем пробовать и эксперементировать, если кому интересны будут результаты то потом опишем :)

Tima
04.08.2017
13:07:51


Vladimir
04.08.2017
13:31:07
Плясали час
Потом все снес нафиг и в N раз все сначала начал
Единственное что изменил это поменял в конфиге ip на hostname (Александр Ярославцев посоветовал за что ему большое спасибо, объяснить ни он ни я толком не можем, но вроде помогло, тьфутьфутьфу)
3 часа прошло, залило 5 млрд данных
Все синхронно пока, очередь на вставку не растет
Ошибок нет
Parts пляшкт вокруг
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 6; do curl 'pprod-spm-ch-'$i'.us.sematext.com:8123?query=select+count(*)+from+system.parts;'; done;
5843
6111
5713
5910
ЗЫ: Вернул timestamp в первичный ключ (без него тоска по запросам, не вижу преград почему он должен мешать). Пишу опять в распределенную таблицу, 2 шарды 2 реплики 4 сервера
ubuntu@pprod-spm-ch-3:~$ for i in seq 3 6; do curl 'pprod-spm-ch-'$i.us.sematext.com':8123?query=select+count(*)+from+default.Measures_Distributed;'; done;
5339916169
5339916169
5339916169
5339916169
Растущее потребление процессора при небольшом падении скорости вставки как я понимаю мержи.
И это клево ибо объяснимо


Александр
04.08.2017
13:44:45
Слава богу работает :) Возможно где то в кишках самого КХ есть трабл с хостнеймами. Он возможно берет хостнейм самой машины, а в конфиге кластера прописаны айпишники, но при просмотре таблицы clusters если мне не изменяет память показываются локальные хостнеймы...короче каша там какая то :) Так что лучше использовать хостнеймы вместо айпишек
У меня были проблемы с репликацией и именно это помогло

Vladimir
04.08.2017
13:47:17
(offtop надо Ленина с пальцем добавить в телеграмм, заморскии этот человек зачем-то тут добавлен)

Combot
04.08.2017
13:49:08
combot.org/chat/-1001080295593
combot.org/chat/-1001080295593

Kostya
04.08.2017
15:36:27
Немного нестандартный вопрос: можно ли как-то ограничить использование диска по скорости при выполнении запросов? В голову приходит только ionice для сервера и опция --max_threads у клиента. Есть ли ещё какие-то настройки, которые можно покрутить?

Google

Ilya
04.08.2017
16:02:58
Вопрос по arrayJoin. Есть таблица bar с полем foo типа Array(FixedString(16)).
Селект вида "SELECT notEmpty(foo) ? arrayJoin(foo) : toFixedString('', 16) FROM bar" приводит к "<Error> executeQuery: Code: 368, e.displayText() = DB::Exception: Bad cast from type N2DB12ColumnStringE to N2DB17ColumnFixedStringE" на сервере.
Версия 1.1.54245. Есть какие-либо другие варианты как сделать так, чтобы при использовании arrayJoin() можно было получить хотя бы одну запись в селекте, если массив foo пустой?
При этом клиент отваливается со своим исключением - Exception on client:
Code: 89. DB::Exception: Unknown compression method: 105: while receiving packet from clickhouse-server:9000, 172.17.0.3

Vladislav
04.08.2017
16:38:26
Всем привет.
А никто не занимется разработкой модуля clickhouse для rsyslog?
Появилась мысля, собирать access логи с всех серверов в кликхаус

Vladimir
04.08.2017
16:43:12

Vladislav
04.08.2017
16:49:47
Наверное лень тратить время на инсталляцию\изучение грейлога. =)

Александр
04.08.2017
16:57:22

Andrey
04.08.2017
16:58:06

Александр
04.08.2017
16:58:39
Ну блин )

Roman
04.08.2017
17:32:32
ну и таким же способом собираются логи с других приложений

Vladislav
04.08.2017
17:33:10
Сервис самописный?

Roman
04.08.2017
17:36:03
да, 200 строчек на го


Alexey
04.08.2017
18:01:17
Пришел с прогулки, поломалась вставка,через 2 часа куча такого посыпалось
2017.08.03 19:15:38.688909 [ 187 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/01/measures/replicas/2, e.what() = DB::Exception, Stack trace:
2017.08.03 19:15:38.702824 [ 340 ] <Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Code: 33, e.displayText() = DB::Exception: Cannot read all data, e.what() = DB::Exception, Stack trace:
2017.08.03 19:15:38.967668 [ 600 ] <Error> InterserverIOHTTPHandler: Code: 221, e.displayText() = DB::Exception: No interserver IO endpoint named DataPartsExchange:/clickhouse/tables/01/measures/replicas/2, e.what() = DB::Exception, Stack trace:
Сейчас прочитал полностью ваши сообщения за сегодня.
"No interserver IO endpoint" - это говорит о том, что соединение идёт не с репликой, а с каким-то другим сервером. Как будто перепутаны адреса. Для разбирательства надо смотреть полную конфигурацию кластера - какие есть серверы, с какими адресами, какие реплики на них созданы. Есть ли на сервере, где выводится такой лог, реплика с именем ноды /clickhouse/tables/01/measures/replicas/2 ? Если нет, то можно ли догадаться, почему на неё идёт запрос?
Реплики анонсируют свои адреса, по которым к ним могут обращаться другие реплики, в ZK в ноде .../host. Туда прописывается FQDN сервера, такой как он сам это определяет (аналогично результату команды hostname -f). Возможно, если что-то не так с конфигурацией сети, это приведёт к подобным эффектам.


Alexander
04.08.2017
18:17:11

Alexey
04.08.2017
18:21:09
И вопрос, замена где именно.
Варианты:
1. В interserver_http_host:
<!-- Hostname that is used by other replicas to request this server.
If not specified, than it is determined analoguous to 'hostname -f' command.
This setting could be used to switch replication to another network interface.
-->
<!--
<interserver_http_host>example.yandex.ru</interserver_http_host>
-->
(обычно его не требуется менять вообще, по-умолчанию берётся FQDN)
2. В конфигурации кластера для Distributed таблиц в секции remote_servers (влияет только на работу Distributed таблиц, но не на процесс репликации).
3. Где-то в системе.


Александр
04.08.2017
18:31:37

Google

Александр
04.08.2017
18:32:16

Admin
ERROR: S client not available

Ilya
04.08.2017
18:33:20
А есть вариант как это сейчас обойти?

Alexey
04.08.2017
18:38:49
Можно преобразовать FixedString в String.
Пример:
CREATE TABLE test.array_fixedstring (x Array(FixedString(16))) ENGINE = Memory
INSERT INTO test.array_fixedstring VALUES (['hello', 'world'])
SELECT notEmpty(x) ? arrayJoin(x) : toFixedString('', 16) FROM test.array_fixedstring
- не работает.
SELECT notEmpty(x) ? arrayJoin(arrayMap(a -> toString(a), x)) : '' FROM test.array_fixedstring
- работает.

Александр
04.08.2017
18:41:27
Вобщем после конфигурации кластера с хостнеймами вместо ip адресов проблема вроде решилась. По крайней мере он больше не говорил о проблемах

Dmitriy
04.08.2017
18:46:17
Привет всем.
хотел два вопроса задать
- есть таблица в которой 20 полей поиск идет по одному полю, из этой таблице нужно только 3 поля
будет ли идти поиск быстрее если таблицу сократить до 3 полей, включая поле по которому идет поиск?
я правильно понимаю что чуда не произойдет и скорость поиска будет такой же?
- насколько быстрее будет проходить запрос если данные поместить в РАМ?
Спасибо

Alexander
04.08.2017
18:50:24


Alexey
04.08.2017
18:53:47
> - насколько быстрее будет проходить запрос если данные поместить в РАМ?
Как правило, существенно быстрее. В общем случае зависит от сложности запроса и от производительности дисковой подсистемы. Вручную помещать данные в оперативку обычно не требуется, так как используется page cache, что позволяет иметь "горячие" данные в оперативке.

Dmitriy
04.08.2017
18:55:59
Спасибо.

Alexander
04.08.2017
18:58:28
А можно вопрос по исходникам? Из MergeTreeReader можно где-то извлечь номер строки? С ходу не так просто оказывается как представлялось, так как похоже, что если seek, то надо считать. Хотел чтобы каждый Block имел номер начальной строки.

Alexey
04.08.2017
19:10:51
С одной стороны надо учитывать, что строки постоянно переупорядочиваются при слияниях. Это ограничивает применимость номера строки, хотя польза всё-равно есть для некоторых приложений.
Также вопрос, нужен ли именно номер, или только некоторое значение, которое соответствует порядку строк. Второе проще.
Совсем простым способом добавить номер строки в MergeTreeReader не получится, но в принципе, добавить не так уж сложно. Нужно всего лишь прокинуть туда минимальный номер строки в каждом part-е, который вычислять из размера меньших по порядку part-ов.


Александр
04.08.2017
19:16:30
С одной стороны надо учитывать, что строки постоянно переупорядочиваются при слияниях. Это ограничивает применимость номера строки, хотя польза всё-равно есть для некоторых приложений.
Также вопрос, нужен ли именно номер, или только некоторое значение, которое соответствует порядку строк. Второе проще.
Совсем простым способом добавить номер строки в MergeTreeReader не получится, но в принципе, добавить не так уж сложно. Нужно всего лишь прокинуть туда минимальный номер строки в каждом part-е, который вычислять из размера меньших по порядку part-ов.
Было бы полезно получить номер строки именно в выдаче. Например я выбираю строки с сортировкой, агрегацией и пр. и хочу использовать номер строки в результирующем ответе, например 1,2,3,4 для дальнейших манипуляций

Alexander
04.08.2017
19:17:04
Я думал что это всё учтено в read_rows_after_current_mark, но похоже нет.

Александр
04.08.2017
19:17:13
Для манипуляций именно в КХ, не на уроне приложения

Alexey
04.08.2017
19:17:52
Это можно получить так:
SELECT rowNumberInAllBlocks(), * FROM (your query)

Alexander
04.08.2017
19:18:09

Google

Александр
04.08.2017
19:18:23
Я имею ввиду, что при распределенном чтении, номер строки будет всегда одинаковый при одинаковом результате?
Если в результате будет 100 строк, то нумерация должна быть от 1 до 100

Alexander
04.08.2017
19:21:55
Номер строки в блоке - это по сути range от 0-32k на каждый блок? (кроме краёв). Тогда если это + начальную строку блока, то будет то что надо.

Александр
04.08.2017
19:21:55
Я полагаю это можно очень просто добавить, но моих навыков в cpp недостаточно :) Поэтому остается либо ждать, либо все таки начинать разбираться и потом присылать PR

Alexey
04.08.2017
19:22:47
Да, у меня были кейсы, когда в процессе агрегации мне нужно было использовать номер строки именно в результирующем наборе данных. Не номер строки где то в БД целиком, типа 231, 444, 572, а именно 1,2,3 и т.д.
Использовать в процессе агрегации номер строки, который получился бы в результате, нет возможности.

Александр
04.08.2017
19:24:26
Типа как то так. И на выходе я например получаю
avg rowNumber()
12 1
33 2
23 3
77 4
Но я думаю, будет не совсем честно делать такую функцию, которая работает только поверх агрегации