
Виктор
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

papa
10.01.2017
15:16:16

Igor
10.01.2017
15:17:52
кстати да :О
черт, я ж ее в документацию добавлял %))

papa
10.01.2017
15:18:01

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: вроде норм откатились, эх, жалко что вообще пришлось :(

papa
11.01.2017
09:05:24

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 интерфейсом на разные порты. Есть ли возможность для разных баз прописать свой порт в рамках одного инстанса сервера, или надо поднимать второй инстанс кликхауса с отдельными настройками?

Dmitry
11.01.2017
10:57:04

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
а он разве не должен учитывать что данные внутри чанка уже отсортированы по ключу?
т.е. по моим представлениям раз данные в кусе уже отсортированы по выражению, которое я прошу - все данные читать не надо и сортировать отдельно тоже не надо - надо просто взять тот порядок что есть.
кстати результат с сортировкой и без - отличается, т.е. видимо сервер читает данные не в том порядке или там кусков больше почему-то и он их все сливает при сортировке.

Dmitry
11.01.2017
11:36:02

Боб
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