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

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

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

23 ответов

13 просмотров

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

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 Чтобы не считать хеш повторно можно это сделать в прикладной программе, которая грузит данные. Пока в КХ нет транзакций, при ошибках может случиться, что в одну таблицу инсерт пройдет, а во вторую - нет (обещали сделать в этом году).

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

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

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Привет, запускаю werf в dind в k8s, получаю ошибку на этапе build/beforeSetup: /.werf/stapel/embedded/bin/bash: /.werf/scripts/5898bdfe5214357d3706b879cc8d3d78460fb379607cbd...
florius0
7
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Подскажите, можно ведь комбинировать запись данных в один и тот же Stream через TFileStream и через TCompressionStream поочерёдно? Ну т.е. часть данных мне нужно сжать, часть ...
notme
4
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Кстати на работу никто не хочет, слегка на Сшке подписывать? От 170к в месяц, под Москвой
Andrey Ermakov
6
Карта сайта