184 похожих чатов

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

"время, событие, название товара"... где название товара - длинная строка.
Логично заменить на ID. В качестве ID можно использовать хеш функцию (колизий нет). Вопрос как правильно средствами кликхауса хранить инфу о соответствии ID=товар?
Проблема в том что постоянно появляются новые товары о которых мы не знали. На данный момент всего 25 миллиона уникальных товаров. И в базу прилетает больше миллиона записей в минуту. Хотелось бы чтобы при вставке данных в кликхаус эта информация писалась в отдельную таблицу.

23 ответов

20 просмотров

насколько я понял вам нужно просто лоукардиналити заюзать и всё

Roman Y
На 25лямов я бы не стал

а точно не заметил этот момент

Ada-Min Автор вопроса
William Ko
насколько я понял вам нужно просто лоукардиналити ...

лоукардиналити эффективен примерно при 64к уникальных объектов. дальше чем больше тем хуже...

Вы потом как то джойнить хотите хеш = строка?

Ada-Min Автор вопроса
Roman Y
Вы потом как то джойнить хотите хеш = строка?

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

Ada Min
да, но только для аналитических целей, т.е. скорос...

этой задачей сжатие занимается, колоночная БД же

Ada Min
да, но только для аналитических целей, т.е. скорос...

А методы сжатия для колонки пробовали разные?

Ada-Min Автор вопроса
Roman Y
А методы сжатия для колонки пробовали разные?

лучшие результаты zstd(1) дает. но кажется что сжатие это неправильное направление. Так как к примеру надо часто считать кол-во уникальных товаров. С хешами это работает быстрее. Хранить и то и другое — неправильно. Плюс хеши на диске занимают в 4 раза меньше места (с учетом сжатия).

Ada Min
лучшие результаты zstd(1) дает. но кажется что сжа...

Ну если дальше у вас джоин (или его аналог) не смущает - то решение отличное

Ada-Min Автор вопроса
Roman Y
Ну если дальше у вас джоин (или его аналог) не сму...

Да, join устраивает. Вопрос как данные записывать? Если хочется чтоб в кликхаус прилетал только один запрос на вставку в основную таблицу?

Лучше lowcardinality, а не джойн. Союытий же мало уникальных? Тогда order by (событие, название товара). Еще дату, а не время в order by добавить перед или после события. Партиции по месяцам или дням. Вообще такой order by и сам по себе строки эти сильно сожмет даже без lowcardinality, а если мало будет, то zstd еще навесить.

William Ko
А как ордер бай сжимает строки?

ну в основном он и сжимает. Одно дело сжать a, d, e, a, x, e... другое дело a, a, a, b, b, b...

Sergey Churin
ну в основном он и сжимает. Одно дело сжать a, d, ...

ага понял. это внутри гранулы индекса одной получается происходит

Sergey Churin
ну в основном он и сжимает. Одно дело сжать a, d, ...

Не совсем так, LowCardinality вместо 'aaa', 'bbb', 'aa', 'bb', 'aaa', 'bbb', 'aa,', 'bb' сожмет 1,2,3,4,1,2,3,4

William Ko
ага понял. это внутри гранулы индекса одной получа...

при селектах LowCardinality не даст снижения получаемого объёма данных, рассматривать жор памяти сервером в данном случае некорректно

William Ko
а почему некорректно? не понял

оно в строку преобразуется

Aleksey Boltenkov
оно в строку преобразуется

ну вот у меня есть замеры когда именно преобразование в lowcardinality сокращает в 2.5х оперативу. некоторые запросы которые по памяти падали начинают проходить

William Ko
ну вот у меня есть замеры когда именно преобразова...

Ну, теоретически, можно было бы сравнивать подноготную, что там за строкой лежит, но...

Вставка в Null таблицу, на ней два MV: 1. считает хеш и пишет все колонки + хеш, но без названия в основую таблицу хранения 2. считает хеш по тому-же самому алгоритму, пишет хеш и название товара в таблицу с engine = Join/ANY (any - на всякий случай, если таки коллизия, а может и all - надо смотреть). Аналитический запрос, требующий название делает joinGet Чтобы не считать хеш повторно можно это сделать в прикладной программе, которая грузит данные. Пока в КХ нет транзакций, при ошибках может случиться, что в одну таблицу инсерт пройдет, а во вторую - нет (обещали сделать в этом году).

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта