Руководство по переводу SQL Amazon Redshift
Типы данных
Пользователи, перемещающие данные между ClickHouse и Redshift, сразу же заметят, что ClickHouse предлагает более широкий диапазон типов, которые также менее ограничительные. В то время как Redshift требует от пользователей указывать возможные длины строк, даже если они переменные, ClickHouse устраняет это ограничение и бремя с пользователя, храня строки без кодирования в байтах. Таким образом, тип String в ClickHouse не имеет ограничений или требований к спецификации длины.
Более того, пользователи могут использовать массивы, кортежи и перечисления, которые отсутствуют в Redshift в качестве первоклассных объектов (хотя массивы/структуры можно имитировать с помощью SUPER
) и вызывают общие неудовольствия у пользователей. Кроме того, ClickHouse позволяет сохранять состояния агрегации, как во время запроса, так и даже в таблице. Это позволит предварительно агрегировать данные, обычно с использованием материализованного представления, что может значительно улучшить производительность запросов для общих запросов.
Ниже мы сопоставляем эквивалентный тип ClickHouse для каждого типа Redshift:
Redshift | ClickHouse |
---|---|
SMALLINT | Int8 * |
INTEGER | Int32 * |
BIGINT | Int64 * |
DECIMAL | UInt128 , UInt256 , Int128 , Int256 , Decimal(P, S) , Decimal32(S) , Decimal64(S) , Decimal128(S) , Decimal256(S) - (высокая точность и возможные диапазоны) |
REAL | Float32 |
DOUBLE PRECISION | Float64 |
BOOLEAN | Bool |
CHAR | String , FixedString |
VARCHAR ** | String |
DATE | Date32 |
TIMESTAMP | DateTime , DateTime64 |
TIMESTAMPTZ | DateTime , DateTime64 |
GEOMETRY | Geo Data Types |
GEOGRAPHY | Geo Data Types (менее развиты, например, нет систем координат - можно эмулировать с помощью функций) |
HLLSKETCH | AggregateFunction(uniqHLL12, X) |
SUPER | Tuple , Nested , Array , JSON , Map |
TIME | DateTime , DateTime64 |
TIMETZ | DateTime , DateTime64 |
VARBYTE ** | String в сочетании с Bit и Encoding функциями |
UInt8
, UInt32
, UInt32
и UInt64
.
**Тип String в ClickHouse по умолчанию не ограничен, но может быть ограничен до конкретных длин с помощью Ограничений.
Синтаксис DDL
Ключи сортировки
Как ClickHouse, так и Redshift имеют концепцию "ключа сортировки", которая определяет, как данные сортируются при хранении. Redshift определяет ключ сортировки с помощью предложения SORTKEY
:
Сравнительно, ClickHouse использует предложение ORDER BY
для указания порядка сортировки:
В большинстве случаев вы можете использовать те же столбцы и порядок ключа сортировки в ClickHouse, как и в Redshift, при условии, что вы используете тип COMPOUND
по умолчанию. Когда данные добавляются в Redshift, вам следует запустить команды VACUUM
и ANALYZE
, чтобы пересортировать вновь добавленные данные и обновить статистику для планировщика запросов - в противном случае несортируемое пространство будет расти. Для ClickHouse такой процесс не требуется.
Redshift поддерживает несколько удобных функций для ключей сортировки. Первая - автоматические ключи сортировки (с использованием SORTKEY AUTO
). Хотя это может быть целесообразно для начала, явные ключи сортировки обеспечивают наилучшую производительность и эффективность хранения, когда ключ сортировки оптимален. Вторая - ключ сортировки INTERLEAVED
, который придает равный вес подмножеству столбцов в ключе сортировки, чтобы улучшить производительность, когда запрос использует один или несколько вторичных столбцов сортировки. ClickHouse поддерживает явные проекции, которые достигают того же конечного результата с немного другой настройкой.
Пользователям следует учитывать, что концепция "первичного ключа" представляет собой разные вещи в ClickHouse и Redshift. В Redshift первичный ключ напоминает традиционную концепцию РСУБД, предназначенную для обеспечения ограничений. Однако они не строго соблюдаются в Redshift и вместо этого действуют как подсказки для планировщика запросов и распределения данных между узлами. В ClickHouse первичный ключ обозначает столбцы, используемые для построения разреженного первичного индекса, который используется для обеспечения порядка данных на диске, максимизируя сжатие и избегая загрязнения первичного индекса и излишнего расхода памяти.