@clickhouse_ru

Страница 6 из 723
?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
не знаю, меня очень порадовал (в плане производительности) INSERT INTO SELECT с фильтром только нужных данных
Только как-то страшно применять такой трюк для шардированых/реплицированных на много серверов таблиц

?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

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
Проще пока что пути не вижу
а планиурете добавить NULL или отказ был осознаным и ждать не стоит?

Виктор
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
gis=> select to_timestamp(0); to_timestamp —---------------------- 1970-01-01 03:00:00+03 (1 row)
Кстати, прикольно, похоже и правда не сохранить чистый 1970-01-01 00:00:00, он будет нулями отображаться

да в любом случае на такое редко будут натыкаться и, если что, можно подменить (как я вон %))

это всё мелочи по сравнению со скоростью движения прогрессбара!

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.

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