Ребята, всем привет!
Вчера возник вопрос, хочется понять истину: имеем в таблице поле, означающее тип события. Типов ограниченное число, но постоянно появляются новые. Стоит вопрос - в каком виде хранить в CH. Вариантов 3: int'ом, string'ом, enum'ом.
Enum отбрасываем, т.к. альтеры делать вовремя не имеем возможности. String у int'а выигрывает удобством дальнейших запросов к статистике (про механизм словарей знаем, но кажется, что они тут некоторым оверхедом являются)
Вопросов 2:
1. при дефолтных настройках, будет ли у string'a сильный проигрыш по объему на диске? Схлопываются ли в рамках партиций одинаковые значения в колонках?
2. планируется много запросов, где данное поле будет фигурировать в where. Есть ли выигрыш по скорости у int'a при фильтрации?
Заранее спасибо за ответы
Таблица - значения телеметрий от устройств. Есть столбец с названием метрики. Сценарий такой же, как у вас - могут появляться новые метрики, но общее количество достаточно небольшое (сейчас 22). В тестовой таблице 400млн строк, распределение метрик неравномерное, есть метрики с 200млн записей, есть с 1млн.
1. Тип метрики String, столбец в сжатом виде - 17Мб, в распакованном - 3,8гб.
Если тип LowCardinality(String) - в сжатом виде 1.7Мб, в распакованном - 377мб.
2. SELECT COUNT() с фильтром по метрике:
String: Elapsed: 4.983 sec. Processed 394.41 million rows, 7.29 GB (79.15 million rows/s., 1.46 GB/s.)
LowCardinality: Elapsed: 1.609 sec. Processed 394.41 million rows, 395.26 MB (245.07 million rows/s., 245.60 MB/s.)