
Vladimir
10.05.2017
15:36:50
FORMAT какой?
В плане формат? По дефолту. Если я прописываю set extremes=1 и потом делаю запрос - clickhouse-client тогда выдается в зависимости от формата данные - по исходному запросу и по экстремам. Если формат JSON - тогда выдается в отдельной структуре в JSON ответе. Если формат не указываю (по моему pretty) тогда выдается 2 табличками. Ну и так далее..... Так вот я прописал в конфу пользователю <extremes>1</extremes> Перерестатовал - перелогинился - сделал запрос - табличка одна. Значит либо а) не то прописал, б) не сработало.
Ок. Сделал подключение в DBeaver - прописал там тоже самое. К сожалению я не знаю как прописывать выдаваемый формат для jdbc. Ну да ладно. Делаю запрос - тоже только 1 таблица по запросу.

Felixoid
10.05.2017
15:39:58

papa
10.05.2017
15:41:29
у jdbc один формат ответа - ResultSet. и по-моему он extremes не поддерживает, т.к. это немного нестандартная штука. в http вы можете получить "две таблички", но парсить их придется самому.

Google

papa
10.05.2017
15:42:06
а как DBeaver должен отреагировать на максимумы-минимумы в ответе?

Vladimir
10.05.2017
15:42:41

papa
10.05.2017
15:43:11
в лучшем случае - выдаст основной ответ, в худшем упадет при разборе ответа.

Vladimir
10.05.2017
15:43:27

papa
10.05.2017
15:44:51
например jdbc при получении group by with totals format tsv оказывается в ситуации, когда у него есть ответ, потом есть одна строка состоящая из пустой строки и потом еще одна строка ответа. и если вы селектите одну строковую колонку, то вы не можете понять "где находитесь".
передача "двух таблиц" в plaint text заканчивается плохо. серверу все равно, он писатель.

Vladimir
10.05.2017
15:47:25
Таким образом я так понимаю на данный момент воспользоваться min и max достаточно как это сказать .... проблематично

papa
10.05.2017
15:56:24
у нас в драйвере есть ClickHouseStatement <: java.sql.Statement , через него можно,
ну или написать запрос select * from (query) cross join (select min/max from (query) ).
только без зведочки, звездочка по-моему до сих пор только левую таблицу заселектит.

f1yegor
10.05.2017
16:36:28

Google

Aleksey
10.05.2017
17:40:28
Вопрос про идемпотентность вставки (которая работает для 100 последних блоков).
В какой момент осуществляется отбрасывание дублирующихся блоков: ещё до вставки или уже после вставки, во время мерджей? Т.е. могут ли дубли всё же на какое-то время появиться в таблице?

Dmitry
10.05.2017
17:41:54
Во время вставки

Aleksey
10.05.2017
17:49:40
А 100 блоков считаются для каждой таблицы отдельно, или 100 - это на всю базу или даже на весь инстанс ClickHouse?
Т.е. если вставить 1 блок в таблицу 1, потом 100 блоков в таблицу 2, и потом опять первый блок в таблицу 1 - он отбросится или вставится?
(судя по моему тесту - вставится, но хотел уточнить: это так задумано, или баг?)
Если так задумано, то, наверно, имеет смысл в документации поправить вот эту фразу:
"Это работает только для последних 100 вставленных в таблицу блоков."

Alex
10.05.2017
18:52:56
Должно быть именно на таблицу

prll
10.05.2017
20:00:14

Иван
10.05.2017
21:37:39
Кто знает, в ReplacingMergeTree слияние дубликатов происходит только в рамках одной партиции или за все время слияния тоже выполняются?

a
10.05.2017
21:41:04
в партиции

Vladislav
10.05.2017
23:34:02
И Final тут тоже не поможет?)

Alexander
11.05.2017
01:36:23
Подумал что чисто теоретически в концепции CH и gpumemory engine может быть :)

Andrey
11.05.2017
03:36:50


Anton
11.05.2017
07:27:01
Привет!
Есть ли способ в CH, имея имя поля как строку, сделать select из этого поля?
Т.е. хочется, чтобы SELECT someFunction('field_name') FROM table_name в действительности делал SELECT field_name FROM table_name
Зачем надо:
Имеем таблицу с некоторым количеством полей плюс-минус одинакового смысла (к примеру, количество ошибок по типам, каждая колонка - отдельный тип ошибки).
Имеем графану с соответствующим datasource. Хочу данные из всех этих полей иметь на одном дашборде без хардкода имён полей, чтобы при добавлении/удалении полей в CH дашборды в графане перестраивались без ручного вмешательства.
Пробовал делать Templating: $metric as SELECT name FROM system.columns WHERE table = 'table_name' AND name NOT LIKE 'date%', но при выбранных опциях 'Multi-value' и/или 'Include All option' в переменной $metric появляется набор строк, разделённых запятой: 'error_type_1', 'error_type_2'. Соответственно, нельзя сделать что-то типа SELECT $metric FROM table_name, т.к. будет выполнено SELECT 'error_type_1' FROM table.


Dima
11.05.2017
07:43:05
всем привет! у вас в документации отсутствует раздел про настройку SSL в КХ. В конфиге есть пример, но пока у меня не получается завести с самоподписанным сертификатом. Строчки
<verificationMode>none</verificationMode>
<name>AcceptCertificateHandler</name>
раскоментировал, но всё равно при попытке подключения в лог сыпется
<Error> ServerErrorHandler: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = SSL Exception: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate, e.what() = SSL Exception

prll
11.05.2017
08:35:43
в тестах есть рабочий пример конфига и подписывания при запуске тестов
ой, попутал, там пример клиента для самоподписаного сервера на питоне

Maksim
11.05.2017
08:44:59
Есть ли простой способ сделать CREATE DATABASE nnn IF EXISTS или проверить наличие такой базы данных на сервере (второе даже лучше)

Felixoid
11.05.2017
08:47:03

Maksim
11.05.2017
08:47:46
блин, стыдно как-то

Nataliya
11.05.2017
09:31:19
Продолжается регистрация на митап ClickHouse в Екатеринбурге 16 мая.
Если есть коллеги, друзья, кому это интересно, то можно поделиться анонсом в сетях:
https://twitter.com/ya_events/status/859366858604109824
https://vk.com/yandex.events?w=wall-17796776_5322
https://www.facebook.com/Yandex.Events/posts/1521278041225645
Спасибо!

Google

Maksim
11.05.2017
09:36:05
ещё вопрос: для заливки данных всё так же только SQL? Очень надоело заниматься экранированием.

Vladimir
11.05.2017
09:49:40

Maksim
11.05.2017
09:50:10
описание структуры посмотреть в сырцах или я не нашел его в документации?

Vladimir
11.05.2017
09:51:12
https://clickhouse.yandex/reference_ru.html#RowBinary
ну или Native
но он сильно сложнее уже

Vladislav
11.05.2017
09:58:58
Вопрос про Clickhouse-client. В elapsed учитывается время передачи ответа клиенту? :)

Maksim
11.05.2017
10:10:41

Aleksey
11.05.2017
10:29:48
Должно быть именно на таблицу
Да, похоже, мой тест был плохим. Ограничение в 100 блоков, как и заявлено, работает в рамках таблицы.
Единственный нюанс - оно не строгое, иногда получается до 110 блоков вставлять без дублирования, а в течение очень короткого промежутка времени может получиться и ещё больше. Но главное, что отклонение в большую сторону, а не в меньшую, так что не страшно.
P.S. Если кому ещё будет интересно - можно поискать в коде переменную replicated_deduplication_window, станет понятно, откуда берётся 110.


Иван
11.05.2017
10:30:15
Такая проблема. Есть таблица, запросы к которой содержат фильтр либо по столбцу а, либо по столбцу b. Проблема в том, что т.к. индекс построен (а,b), то фильтрация по столбцу b, с учетом того, что фактов записей в таблице с десяток миллиардов, не представляется возможной. Кто как поступает в такой ситуации? Есть мысль создать еще одну таблицу с индексом (b,a) и дублировать в нее данные. Но что-то не очень нравится мне эта идея.

Alex
11.05.2017
10:36:32

Иван
11.05.2017
10:49:37

Pavel
11.05.2017
10:50:27
а ключи постфактум можно регенерировать?

Vladislav
11.05.2017
10:55:05
Ни у кого не было проблем с PREWHERE? Делаю SELECT * FROM TABLE_NAME PREWHERE IsExternal = 1. IsExternal UInt8. Всего 500 тысяч строк. В итоге Processed 500mb, столько же ровно сколько и у WHERE...
В документации не нашёл ничего про то, что PREWHERE работает только с первичными ключами или только с определёнными типами.
PREWHERE в итоге должен был выбрать одну строчку:)

papa
11.05.2017
10:56:48
у вас же select *
а, строчку.

Vladislav
11.05.2017
10:57:05
Да, описался :)
Ну я бы понял, если бы он 500мб и выбрал, но там не больше килобайта в строчке)

Google

Vladislav
11.05.2017
10:57:50
ReplacingMergeTree Engine

Igor
11.05.2017
10:58:29
эм.. а строчка с isexternal == 1 в таблице только одна?

papa
11.05.2017
10:58:35
вообще clickhouse пушит в prewhere условие по самой компактной колонке, так что ваш запрос с where возможно работает так же.
но 500mb это видимо не объясняет.

Vladislav
11.05.2017
10:59:55
Хм, интересный вопрос. Вообще я сделал ему limit 1. И думал что он не пойдёт выбирать все и по ним делать limti
А сделает limit по строкам с true, но я мог сильно ошибаться
Точнее limit 500000, 1
Но такое же поведение я наблюдаю используя has(Array, Id). Там он выбирает 90 строк и тоже имеет одинаковые затраты при PREWHERE и WHERE

Pavel
11.05.2017
11:03:40
https://www.pilosa.com

Vladislav
11.05.2017
11:03:41
Уже без limit

papa
11.05.2017
11:11:52
Точнее limit 500000, 1
надо пропустить 500к строк. если у вас строки по килобайту, то вот они и получатся. prewhere выбирает блоки с выполненным условием, читая при этом меньшее число колонок.

Vladislav
11.05.2017
11:12:49
Ок... А не подгружая строки он этого делать не умеет? Типа PRELIMIT

papa
11.05.2017
11:13:23
запрос работает как limit(where(from))

Vladislav
11.05.2017
11:14:36
Аа, ок. А с has почему так? Там вес колонки 45 мб, и limit уже нет...

papa
11.05.2017
11:16:34
возможно у вас эти 90 строк равномерно по всем блокам размазаны. надо смотреть на конкретные запросы и таблицы.

Vladislav
11.05.2017
11:17:16
Ну блок по умолчанию 65 кб, это 6 мб на все строки
Если я правильно понимаю, как он их грузит...
А, это количество строк, 65 тыс строк. Понял :) Сейчам попробую поменять размер

Alex
11.05.2017
11:21:38

Vladislav
11.05.2017
11:27:18
Как-то на него это не произвело должного впечатления. Выглядит так, будто prewhere просто не работает. Но я не очень понимаю, что не так в настройках.

Google

Sergei
11.05.2017
11:53:39
https://blog.cloudflare.com/how-cloudflare-analyzes-1m-dns-queries-per-second/?utm_content=bufferd2952&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

Pavel
11.05.2017
11:57:32
Угу;)

Sergei
11.05.2017
11:58:25
Подробно описывают, как пришли к кликхаусу. Какие либы используют и даже про железо. Найс

Pavel
11.05.2017
11:58:58
если есть вопросы, я могу передать коллегам либо ответить сам
я как раз занимался первичными тестами на синтетической нагрузке.

papa
11.05.2017
12:02:29
1M rps, понятно зачем нужен был нативный протокол.

Pavel
11.05.2017
12:03:20
не только поэтому, я думаю protobuf и прочие тоже бы выдержали такую нагрузку
проблема была в том, что эта статистика собирается из hot path
то есть вместе с запросом клиента, а в этом случае ключевая проблема - это оверхед, который вносит сборка / отпарвка этих сообщений
у capnp он ну очень маленький и сообщения собираются крайне быстро, избегая выделений памяти вообще
то есть, берется блок памяти из пула памяти и потом уже код демона заполняет его информацией которую извлек из запроса клиента и ставит в очередь на отправку на коллектор

papa
11.05.2017
12:08:45
default settings is to make a mark of every 8,192th row. This way only 122,070 marks are required to sparsely index a table with 1 trillion rows,
но ведь это миллиард. 8192*122070

Maksim
11.05.2017
12:39:09
можете подсказать по FORMAT RowBinary: если я правильно понимаю, то надо как-то сообщить кликхаусу с какого байта начинаются сырые данные
как правильно сообщить, что закончился текстовый INSERT и поехали бинарные данные?
INSERT INTO sessions (....) VALUES FORMAT RowBinary binarydata
вот что может стоять между RowBinary и binarydata ?

Vladimir
11.05.2017
12:42:03

Maksim
11.05.2017
12:42:14
спасибо
да, всё заработало, большое спасибо