Типы данных
Числовые типы
Float64 обеспечивает
более широкий диапазон значений ценой потери точности.
В отличие от этого, ClickHouse предлагает несколько вариантов знаковых и беззнаковых
целых типов и типов с плавающей точкой разной точности. Благодаря этому можно явно указать,
какая точность требуется для целых чисел, чтобы оптимизировать накладные расходы на хранение и память. Тип
Decimal, эквивалентный типу Number в Snowflake, также поддерживает вдвое большую
precision и scale — до 76 цифр. Помимо аналогичного типа Float64,
ClickHouse также предоставляет Float32 для случаев, когда точность менее критична, а
сжатие важнее всего.
Строки
VARCHAR в Snowflake хранит символы Unicode в UTF-8 и позволяет
пользователю задавать максимальную длину. Эта длина не влияет ни на хранение, ни на
производительность: для хранения строки всегда используется минимально необходимое число байтов,
а сама длина служит лишь ограничением, полезным для последующих инструментов. Другие типы,
такие как Text и NChar, — это просто псевдонимы этого типа. ClickHouse, напротив,
хранит все строковые данные как необработанные байты в типе String
(указывать длину не требуется), оставляя выбор кодировки на усмотрение пользователя; при этом
функции времени выполнения запроса
доступны для разных кодировок. О причинах такого подхода см. в статье “Opaque data argument”.
Таким образом, по своей реализации String в ClickHouse в большей степени сопоставим
с типом Snowflake Binary. И Snowflake,
и ClickHouse
поддерживают «collation», что позволяет пользователям переопределять правила сортировки и сравнения строк.
Полуструктурированные типы
VARIANT, OBJECT и ARRAY для полуструктурированных
данных.
ClickHouse предлагает эквивалентные типы Variant,
Object (теперь устаревший в пользу нативного типа JSON) и Array.
Кроме того, в ClickHouse есть тип JSON,
который заменяет устаревший тип Object('json') и отличается особенно
высокой производительностью и эффективностью хранения в сравнении с другими нативными JSON-типами.
ClickHouse также поддерживает именованные Tuple и массивы Tuple
через тип Nested,
что позволяет пользователям явно описывать вложенные структуры. Это позволяет применять кодеки и оптимизации типов
на всех уровнях иерархии, в отличие от Snowflake, который
требует использовать типы OBJECT, VARIANT и ARRAY для внешнего
объекта и не позволяет явно задавать внутреннюю типизацию.
Такая внутренняя типизация также упрощает запросы к вложенным числовым значениям в ClickHouse,
которые не нужно приводить к другому типу и которые можно использовать в определениях индексов.
В ClickHouse кодеки и оптимизированные типы также можно применять к вложенным подструктурам.
Это дает дополнительное преимущество: сжатие для вложенных структур остается
очень эффективным и сопоставимым со сжатием для плоских данных. Напротив, из-за
невозможности применять конкретные типы к подструктурам Snowflake рекомендует выравнивать
данные для достижения оптимального сжатия.
Snowflake также накладывает ограничения на размер
для этих типов данных.
Справочник типов
| Snowflake | ClickHouse | Примечание | |
|---|---|---|---|
NUMBER | Decimal | ClickHouse поддерживает вдвое большую точность и масштаб по сравнению со Snowflake: 76 цифр против 38. | |
FLOAT, FLOAT4, FLOAT8 | Float32, Float64 | В Snowflake все числа с плавающей точкой имеют разрядность 64 бита. | |
VARCHAR | String | ||
BINARY | String | ||
BOOLEAN | Bool | ||
DATE | Date, Date32 | DATE в Snowflake поддерживает более широкий диапазон дат, чем в ClickHouse; например, минимальное значение для Date32 — 1900-01-01, а для Date — 1970-01-01. Date в ClickHouse обеспечивает более экономичное хранение (два байта). | |
TIME(N) | Прямого эквивалента нет, но можно использовать DateTime и DateTime64(N). | DateTime64 использует тот же принцип точности. | |
TIMESTAMP - TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZ | DateTime и DateTime64 | DateTime и DateTime64 могут при необходимости иметь параметр TZ, заданный для столбца. Если он не указан, используется часовой пояс сервера. Кроме того, для клиента доступен параметр --use_client_time_zone. | |
VARIANT | JSON, Tuple, Nested | Тип JSON в ClickHouse является экспериментальным. Этот тип определяет типы столбцов при вставке. В качестве альтернативы для построения структур с явно заданными типами также можно использовать Tuple, Nested и Array. | |
OBJECT | Tuple, Map, JSON | И OBJECT, и Map аналогичны типу JSON в ClickHouse, где ключи имеют тип String. В ClickHouse значения должны быть согласованными и строго типизированными, тогда как в Snowflake используется VARIANT. Это означает, что значения для разных ключей могут иметь разные типы. Если это необходимо в ClickHouse, явно определите иерархию с помощью Tuple или используйте тип JSON. | |
ARRAY | Array, Nested | ARRAY в Snowflake использует для элементов VARIANT — надтип. В ClickHouse, напротив, они строго типизированы. | |
GEOGRAPHY | Point, Ring, Polygon, MultiPolygon | Snowflake навязывает систему координат (WGS 84), тогда как в ClickHouse она применяется на этапе выполнения запроса. | |
GEOMETRY | Point, Ring, Polygon, MultiPolygon |
| Тип ClickHouse | Описание |
|---|---|
IPv4 и IPv6 | Типы для IP-адресов, потенциально обеспечивающие более эффективное хранение, чем в Snowflake. |
FixedString | Позволяет использовать строки фиксированной длины в байтах, что полезно для хешей. |
LowCardinality | Позволяет кодировать любой тип с использованием словаря. Полезно, если ожидаемая мощность < 100k. |
Enum | Позволяет эффективно кодировать именованные значения в диапазоне 8 или 16 бит. |
UUID | Для эффективного хранения UUID. |
Array(Float32) | Векторы можно представлять как Array из Float32 с поддержкой функций расстояния. |