ClickHouse: имеет ли смысл использовать поля LowCardinality в Uint8 как логические?

LowCardinality поля в ClickHouse - это оптимизация, где значения кодируются по словарю для более быстрого поиска и меньшего объема памяти. Согласно документации:

Эффективность использования типа данных LowCarditality зависит от разнообразия данных. Если словарь содержит менее 10 000 различных значений, ClickHouse в основном показывает более высокую эффективность чтения и хранения данных. Если словарь содержит более 100 000 различных значений, ClickHouse может работать хуже, чем при использовании обычных типов данных.

А как насчет значений UInt8, используемых как логические? Кардинальность равна 2, но с такой малой занимаемой площадью (8), действительно ли она принесет пользу в запросах для ее использования?


person xmar    schedule 11.06.2020    source источник
comment
Они не «превращены в словарь» - это значения dictionary (en) закодировано. Даже без каких-либо накладных расходов словаря размер закодированных данных может быть не меньше размера ключа словаря (и любых дополнительных накладных расходов). Обратите внимание, что clickhouse.tech/docs/en/operations/settings/settings имеет порог в 8 байтов.   -  person user2864740    schedule 11.06.2020
comment
Вы правы, отредактировал мой вопрос.   -  person xmar    schedule 11.06.2020
comment
В любом случае, в настройках обратите внимание, что allow_suspicious_low_cardinality_types имеет порог в 8 байт (на 800% больше). Затем он дает объяснение по нескольким причинам. Попробуй и увидишь?   -  person user2864740    schedule 11.06.2020


Ответы (1)


LowCardinality имеет смысл в основном для типа String.

LowCardinality (UInt8) всегда хуже UInt8.

В очень редких случаях LowCardinality имеет смысл для числовых типов. Но я бы даже не стал его тестировать, потому что это пустая трата времени. Указатель на словарь LC принимает (Int8-Int32) в файле .bin, поэтому для хранения числового значения в файле .bin дешевле использовать дисковое пространство и ЦП.

person Denny Crane    schedule 11.06.2020