@clickhouse_ru

Страница 46 из 723
Виктор
10.01.2017
11:59:16
Работает только для последнего

Alexey
10.01.2017
12:00:06
@f1yegor да, я тоже так подумал уже после того, как написал )

f1yegor
10.01.2017
12:15:13
@the_real_jkee когда я так делаю я получаю только для всех строчек

Totals: ┌─variant_id─┬─feature_instance_id─┬─uniq(session_id)─┬─count()─┐ │ 0 │ │ 1080 │ 15033 │ └────────────┴─────────────────────┴──────────────────┴─────────┘

Google
f1yegor
10.01.2017
12:16:21
select uniq(id) from events group by a, b with totals.

Виктор
10.01.2017
12:40:18
Так и должно быть, это я и имею в виду

f1yegor
10.01.2017
12:43:12
можно открыть FR на olap-cube statistic, чтобы with totals работало для подгрупп?

Виктор
10.01.2017
12:44:59
Давно обсуждается

Возможно, уже открыто

f1yegor
10.01.2017
12:55:22
спасибо, если не найду до ночи - то заведу

я нашел примерную документацию

https://oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets. соответственно подразумевается rollup функциональность

Igor
10.01.2017
14:46:27
а runningAccumulate это даже близко не то, да?

Arseniy
10.01.2017
14:58:08
привет, подскажите, как реализовать максимум из двух значений, типа max((select ...), (select ...))? Функция max принимает только один аргумент, а если давать ей массив/кортеж, то она возвращает его целиком. Подозреваю, что ей нужно передавать столбец, но вот как его сделать из значений? Спасибо

Igor
10.01.2017
15:04:11
:) SELECT max(arr) FROM (SELECT arrayJoin([123, 456, 789]) AS arr) если я правильно понял

даже проще, SELECT max(arrayJoin([123, 456, 789]))

туплю ))

Google
f1yegor
10.01.2017
15:07:00
а runningAccumulate это даже близко не то, да?
подозреваю что это наподобие runningDifference, нет, они по разному будут работать, если только не научиться задавать условие обнуления. здесь вроде такое обсуждалось

Igor
10.01.2017
15:17:52
кстати да :О

черт, я ж ее в документацию добавлял %))

Igor
10.01.2017
15:18:42
:(

Arseniy
10.01.2017
15:18:57
@iamigor @orantius спасибо!

Alexander
10.01.2017
15:21:46
На мой взгляд, ее лучше переименовать в arrayMax, чтобы была похожа на остальные фунции с массивами

Igor
10.01.2017
15:22:17
тоже об этом подумал. но это комбинатор, как -If

papa
10.01.2017
15:22:22
кого?

Alexander
10.01.2017
15:22:26
Также мне казалось, есть аналог fold для массива, но в документации не вижу

Igor
10.01.2017
15:22:47
т.е. логично, что есть sum(), sumIf(), sumArray(); min(), minIf(), minArray() итд

papa
10.01.2017
15:23:16
arrayReduce('max', [123, 456])

Alexander
10.01.2017
15:23:24
точно

И все же просится все называть array*

Igor
10.01.2017
15:24:10
ваще да, плюсую

Алексей говорил вроде, что планируются алиасы для функций

Боб
11.01.2017
05:42:05
было бы здорово оптимизировать вложенные запросы к одинаковым таблицам - чтобы данные только 1 раз доставались.

Igor
11.01.2017
05:44:00
> Одинаковые подзапросы тоже склеиваются. можно, наверное, делать одинаковые подзапросы и фильтровать их потом снаружи?

Боб
11.01.2017
05:44:08
т.е. например select (select count() from t where date =today()) as today, (select count() from t where date=today()-1) as yesterday пусть бы оптимизатор объединял условия и доставал данные как для where date=today() or date=today()-1 а потом бы уже отдавал каждую строку конвееру соотв. запросов.

Google
Боб
11.01.2017
05:44:30
я проверял - не склеиваются. Делаю два одинаковых селекта - время вырастает вдвое.

щас еще раз проверю

Igor
11.01.2017
05:46:31
хм, и правда, у меня тоже дважды выполняются :( но я с помощью sleep() проверил, :) SELECT * FROM (SELECT 1, sleep(1)) ANY LEFT JOIN (SELECT 1, sleep(1)) USING 1; не знаю, насколько это корректно

Боб
11.01.2017
05:48:11
Connected to ClickHouse server version 1.1.54112. :) select (select count() from traffic) as c1 SELECT ( SELECT count() FROM traffic ) AS c1 1 rows in set. Elapsed: 0.402 sec. :) select (select count() from traffic) as c1, (select count() from traffic) as c2 SELECT ( SELECT count() FROM traffic ) AS c1, ( SELECT count() FROM traffic ) AS c2 1 rows in set. Elapsed: 0.872 sec.

Dmitry
11.01.2017
06:01:43
Кстати, тоже сталкивался с тем, что одинаковые запросы не склеивались.

f1yegor
11.01.2017
06:03:05
Просится простой explain, где показано сколько из каждой таблицы выгребается и сколько уходит на join

Igor
11.01.2017
06:04:03
если обновили сервер 54083 до 54127, можно ли обратно до 54083 откатиться без (очевидных) проблем? там никаких изменений в формате хранения данных, например, нету? upd: вроде норм откатились, эх, жалко что вообще пришлось :(

Igor
11.01.2017
09:05:48
спасибо огромное!

Боб
11.01.2017
10:50:29
Есть таблица: CREATE TABLE traffic ( EventDate Date DEFAULT today(), Timestamp UInt32, UserID String, UserIDHash UInt64 DEFAULT sipHash64(UserID), ...) ENGINE = MergeTree(EventDate, (UserIDHash, EventDate, Timestamp), 8192) когда я делаю запрос select * from traffic WHERE EventDate=toDate('2017-01-01') limit 10 запрос выполняется моментально когда добавляю ORDER BY UserIDHash select * from traffic WHERE EventDate=toDate('2017-01-01') ORDER BY EventDate,UserIDHash limit 10 запрос выполняется 7 секунд и сканирует дофига гигабайтов данных. По моим представлениям EventDate должно было ограничить чтение одним куском данных, в котором записи расположены в порядке : UserIDHash, EventDate, Timestamp т.е. надо было просто взять первые 10 строк и должно выполняться так же быстро как вариант без ORDER BY что я понял не так?

второй запрос: select * from traffic WHERE EventDate=toDate('2017-01-01') ORDER BY UserIDHash limit 10

Dmitry
11.01.2017
10:52:24
Не совсем. Таблица партиционированна по EventDate, но в рамках партиции данные уже отсортированы по UserIDHash, EventDate, Timestamp

запрос требует в первую очередь сортировать по EventDate, это не так как физически лежат данные

select * from traffic WHERE EventDate=toDate('2017-01-01') ORDER BY UserIDHash limit 10 быстро выполняется?

Боб
11.01.2017
10:53:37
это опечатка была, я правильный запрос след. сообщением отправил

нет

тоже 6 секунд

Dmitrii
11.01.2017
10:56:26
Привет! Есть необходимость развернуть на одной машине две базы, при этом, базы должны светиться http интерфейсом на разные порты. Есть ли возможность для разных баз прописать свой порт в рамках одного инстанса сервера, или надо поднимать второй инстанс кликхауса с отдельными настройками?

Google
Dmitrii
11.01.2017
10:57:26
Уащпе?

Dmitry
11.01.2017
10:57:26
А чем не устраивает поднять на одном сервере с разными пользователями?

Dmitrii
11.01.2017
10:57:54
устроит, если это сработает.

Dmitry
11.01.2017
10:57:58
Уащпе?
Это ну крайне редкий функционал. Не знаю ни одну бд которая бы так умела

Dmitrii
11.01.2017
10:58:21
Согласен

Dmitry
11.01.2017
10:58:32
устроит, если это сработает.
Конечно сработает. У пользователя можно написать к каким базам у него будет доступ

Dmitrii
11.01.2017
10:59:42
Ну, то есть, грубо говоря, так сделать в рамках одного сервера можно :)

отлично! спасибо большое, про пользователей я не подумал.

Боб
11.01.2017
11:04:03
попробовал выполнить: select UserIDHash from traffic WHERE EventDate=toDate('2017-01-01') ORDER BY UserIDHash limit 10 запрос выполнился за 0.1 секунды, при этом просканировал гигабайт данных

Dmitry
11.01.2017
11:05:25
Да, действительно долго, тогда Леша точнее ответит

можно where на prewere попробовать заменить, возможно быстрее будет

Боб
11.01.2017
11:09:49
попробовал, получается дольше (0.2 сек вместо 0.1) при выборке только UserIDHash, при выборке всех полей время не изменилось. Объем сканируемых данных от WHERE/PREWHERE тоже не меняется.

Igor
11.01.2017
11:13:56
я не помню точно, вроде порядок полей в pk имеет значение что если сделать рядом табличку с таким движком и попробовать на ней? MergeTree(EventDate, (EventDate, UserIDHash, Timestamp), 8192)

т.е. дату в самое начало вынести хотя PREWHERE в таком случае все равно спас бы

Dmitry
11.01.2017
11:15:13
нет, PREWHERE работает до сортировки, поэтому тут не роляет

Igor
11.01.2017
11:15:27
угу

Dmitry
11.01.2017
11:17:23
а по поводу таблички - да, может сработать. Тут пожоже дело в том, что при структуре (UserIDHash, EventDate, Timestamp) запрос where все равно должен прочитать партицию с сделать фильтрацию по дате.

WHERE EventDate=toDate('2017-01-01') ограничивает список партиций в которых надо выполнять поиск, но в партиции может лежать больше одного дня. (партиции склеиваются до месяца)

Igor
11.01.2017
11:18:54
и потом по партиции делается поиск по useridhash, а не по дате не уверен, что я правильно выразился сейчас :( в общем, интересно, изменится ли что-нибудь есть порядок ключей поменять

Боб
11.01.2017
11:28:29
нет, не похоже. Тогда без OrderBY движок тоже должен был бы всю партицию сканировать чтобы дату отфильтровать и это занимало бы столько же времени. А если ORDER BY UserIDHash убрать, то select UserIDHash from traffic WHERE EventDate=toDate('2017-01-01') limit 10 выполняется за 0.01 секунды (в 10 раз быстрее) и сканирует 4Мб, а не гигабайт данных

Google
Igor
11.01.2017
11:30:18
мм.. ну, ORDER BY же выполняется раньше, чем LIMIT 10 т.е. ему надо взять все хэши за эту дату, отсортировать их, и уже среди отсортированных взять первые 10

а последний запрос проще - он просто берет первые 10 в том порядке, что есть, и берет хэши только для этих 10

получается, эти 4 мб это как раз один за блок данных и все

Боб
11.01.2017
11:34:12
а он разве не должен учитывать что данные внутри чанка уже отсортированы по ключу? т.е. по моим представлениям раз данные в кусе уже отсортированы по выражению, которое я прошу - все данные читать не надо и сортировать отдельно тоже не надо - надо просто взять тот порядок что есть.

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

Боб
11.01.2017
11:43:02
т.е. если есть фильтр и сортировка - весь чанк сначала фильтруется, потом сортируется, потом лимит. а если сортировки нет, то лимит применяется прямо во время фильтрации (where) ?

Vladimir
11.01.2017
13:15:56
Нас ровно три сотни! ?

Combot
11.01.2017
13:16:00
combot.org/chat/-1001080295593

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