
?Zloool?
11.11.2016
09:45:51
Кешируются ли вложенные запросы? Или кеш идет по всему запросу целиком?

Виктор
11.11.2016
09:46:06
Ничего не кешируется.
CH активно полагается на кэш файловой системы
Обычно, это работает хорошо, если данные запрашиваются близкие.

Google

Виктор
11.11.2016
09:47:32
Для аналитического паттерна обычно кэширование по запросам бесполезно, так как запросы не повторяются.
О, статья на вики: https://en.wikipedia.org/wiki/ClickHouse

Kirill
11.11.2016
09:52:39

?Zloool?
11.11.2016
09:56:11
https://yadi.sk/i/fYaD8jjByPEir
Что дает такой результат тогда?

Виктор
11.11.2016
09:57:03
Как раз кэш файловой системы

?Zloool?
11.11.2016
09:57:11
Ага, интересно

Виктор
11.11.2016
09:57:26
На count() работает очень эффективно потому что по сути данные не читаются, и это random access
Ну и разница между диском и памятью для random access понятно что очень большая
@milovidov_an я ведь прав?

?Zloool?
11.11.2016
10:03:56
Просто я как раз пишу запрос с count() для пагинации, и мне интересно как это правильно сделать
Только не тыкайте палками если я чтото неправильно спрашиваю, я не хайлоад, я только учусь

Виктор
11.11.2016
10:06:37
В смысле - для того чтобы написать сколько там ещё страниц листать можно?

?Zloool?
11.11.2016
10:06:47
Да

Google

Виктор
11.11.2016
10:07:27
Советую посмотреть на rows_before_limit_at_least
https://clickhouse.yandex/reference_en.html#JSON
Мы используем для пагинаторов именно это поле
Получается, можно получить всю информацию за один запрос.

?Zloool?
11.11.2016
10:11:56
Круто, спасибо

Vitaliy
11.11.2016
11:25:11
На count() работает очень эффективно потому что по сути данные не читаются, и это random access
@zloool
В таком случае если не ошибаюсь читается одна (самая маленькая) колонка. Поэтому в бенчамарке при увеличении количества строк время первого запроса увеличивается (хоть и не линейно). Но вторые и третие запросы уже вполняются в разы быстрее, а зависимость от числа строк становится более линейной, что говорит о том, что какой-то кэш работает.
В кликхаусе для таких кейсов есть кэш разжатых блоков
https://clickhouse.yandex/reference_ru.html#use_uncompressed_cache
По-умолчанию он выключен, а даже если и включен, то старается использоваться для маленьких кусков данных.
Не понятно какие настройки использовались в бенчмарке, но есть основания полагать, что тут она использовалась.

?Zloool?
11.11.2016
11:50:04
Спасибо

Alexey
11.11.2016
13:13:19
В бенчмарке не используется use_uncompressed_cache.

Igor
11.11.2016
14:27:37
А как правильнее проверить столбец на NULLоподобность, и если он таковой, то подставить в данные что-нибудь другое?
вот, например, моя попытка избавиться от "0000-00-00 00:00:00" и фигачить пустую строку:
toUInt64(created_at) != 0 ? toString(created_at) : ''

Алексей
11.11.2016
14:29:31
я думаю вместо нула писать несуществующее или не имеющее логического смысла значение
типа -100

これはスタスか…ロマンですか
11.11.2016
14:30:29

Igor
11.11.2016
14:31:03
yeah, but NULLs aren't supported for now

これはスタスか…ロマンですか
11.11.2016
14:31:28
what about ASCII null character?

Igor
11.11.2016
14:31:38
It is used in the FixedStrings

Виктор
11.11.2016
14:32:10
Игорь, не очень понял: хочется ткое в данных хранить или как?
Если тип данных это DateTime то лучше хранить именно 0000-00-00 00:00:00

Igor
11.11.2016
14:32:35
хочется, наоборот, вывести SELECTом, экспортнуть в TSV, всё такое

Виктор
11.11.2016
14:32:38
что по сути является 0
А

Google

Виктор
11.11.2016
14:33:16
Да, тогда ваш запрос вполне окей

Igor
11.11.2016
14:33:24
да, знаю)
просто запрос совсем страшным становится из-за таких выражений, а все лишь для того, чтобы в CSV было не "0000-00-00 00:00:00", а пустая строка
ОК, спасибо!

Виктор
11.11.2016
14:33:45
Проще пока что пути не вижу
Ну и не так уж страшно =)

Igor
11.11.2016
14:34:08
это вы еще мой способ конвертить FixedString(16) в UUID не видели!
хотя, наверное, видели. ну да ладно

Виктор
11.11.2016
14:34:43
Я такие запросы видел, что мне кажется меня ничем не удивить

Igor
11.11.2016
14:34:52
не представляю :)

Виктор
11.11.2016
14:35:02
machine learning формулы на sql например

Igor
11.11.2016
14:35:23
как раз недавно натыкался на статью, как нейронную сеть на SQL писали
http://blog.itdxer.com/2016/07/01/neural-networs-in-mysql.html вот эта вроде.
извините за оффтоп

Vladislav
11.11.2016
14:44:42

Виктор
11.11.2016
14:45:14
Планируется
Отказ был осознанным :)
Но необходимость понятна

Vladislav
11.11.2016
14:45:49
отлично

Виктор
11.11.2016
14:45:49
Так что будут nullable типы и столбцы

Vitaliy
11.11.2016
14:45:52
Пулл реквест даже уже есть https://github.com/yandex/ClickHouse/pull/70

これはスタスか…ロマンですか
11.11.2016
14:46:07

Google

Виктор
11.11.2016
14:46:14
Они будут работать несколько медленней.
Так что только по необходимости

Darafei
11.11.2016
15:12:17
его же нет, нет в мире года 0000
потом человеческие парсеры ломаются

Dmitry
11.11.2016
15:12:55
:) select toDateTime(0)
SELECT toDateTime(0)
┌───────toDateTime(0)─┐
│ 0000-00-00 00:00:00 │
└─────────────────────┘
1 rows in set. Elapsed: 0.003 sec.
:)

Darafei
11.11.2016
15:13:45
gis=> select to_timestamp(0);
to_timestamp
—----------------------
1970-01-01 03:00:00+03
(1 row)

Igor
11.11.2016
15:14:55
да в любом случае на такое редко будут натыкаться и, если что, можно подменить (как я вон %))
это всё мелочи по сравнению со скоростью движения прогрессбара!

Darafei
11.11.2016
15:16:10
да, а я потом в постгресе fdw не могу сделать в базы, которые год 0000 изобрели :)

Igor
11.11.2016
15:16:49
да мы с коллегами сейчас тоже не смогли, пришлось после FORMAT CSV еще sed -i -- 's/\"0000-00-00 00:00:00\"//g' натравливать

Darafei
11.11.2016
15:17:06
:'(

papa
11.11.2016
15:17:57
SELECT toYear(toDateTime(0))
┌─toYear(toDateTime(0))─┐
│ 1970 │
└───────────────────────┘

Roman
11.11.2016
15:18:35
забавно
:) select toDateTime('1950-01-01 00:00:00');
SELECT toDateTime('1950-01-01 00:00:00')
┌─toDateTime(\'1950-01-01 00:00:00\')─┐
│ 0000-00-00 00:00:00 │
└─────────────────────────────────────┘
1 rows in set. Elapsed: 0.001 sec.

Igor
11.11.2016
15:19:12
да, не поддерживается ничего до unixepoch

Darafei
11.11.2016
15:19:32
его unsigned сделали, что ли?

Igor
11.11.2016
15:19:33
по-моему потому что там в UInt64 фактически время хранится

Darafei
11.11.2016
15:20:04
а, то есть 20001 год нужен, а 1950 нет :'(

Igor
11.11.2016
15:20:42
Причем у toDateTime есть хитрая особенность, он до какого-то числа жрет не секунды, а дни

Google

Igor
11.11.2016
15:20:54
:) SELECT toDate(365);
┌─toDate(365)─┐
│ 1971-01-01 │
└─────────────┘

Roman
11.11.2016
15:21:38
действительно. в доке есть про это
"Позволяет хранить значения от чуть больше, чем начала unix-эпохи до верхнего порога, определяющегося константой на этапе компиляции"
ну не очень-то и хотелось

Igor
11.11.2016
15:22:22
:) SELECT toDate(10000) AS a, toDate(100000) AS b, toDate(1478877709) AS c;
┌──────────a─┬──────────b─┬──────────c─┐
│ 1997-05-19 │ 1970-01-02 │ 2016-11-11 │
└────────────┴────────────┴────────────┘
вот наглядней

Darafei
11.11.2016
15:22:39
это вообще проектировали? :)
ну, на доске, хотя бы

Igor
11.11.2016
15:24:12
ну видимо в метрике понадобилось оптимизировать какие-нибудь запросы с toDate

papa
11.11.2016
15:24:59
SELECT
toDate(24855),
toDate(24856)
┌─toDate(24855)─┬─toDate(24856)─┐
│ 2038-01-19 │ 0000-00-00 │
└───────────────┴───────────────┘

Igor
11.11.2016
16:00:22
а функция empty() разве не должна возвращать true для FixedString, полностью заполненных NULами?
оборачивать в toStringCutToZero как-то глупо
:) SELECT toFixedString('', 4) AS str, empty(str) AS is_empty;
┌─str──────┬─is_empty─┐
│ \0\0\0\0 │ 0 │
└──────────┴──────────┘

Alexey
11.11.2016
16:08:44
Да, для FixedString функция empty сейчас бессмысленна. Можно пересмотреть.

Igor
11.11.2016
16:09:03
ОК, спасибо!

Alexey
11.11.2016
18:00:24
Обсудили. Коллеги говорят, что делать empty = 1 для FixedString, заполненной нулевыми байтами, нелогично.
Можно писать типа IPv6 = toFixedString('', 16) вместо empty(IPv6)

Igor
11.11.2016
18:10:46
хм, а почему? не совсем понял :(

Alexey
11.11.2016
18:13:03
Спорный момент. Строка, заполненная нулевыми байтами, всё-таки непустая.
И если не упоминать, что это строка фиксированного размера, то это совершенно ясно.
Также ради инварианта: empty(x) то же самое что и length(x) = 0.