Руководство по преобразованию SQL-запросов Amazon Redshift
Типы данных
Пользователи, переносящие данные между ClickHouse и Redshift, сразу заметят, что ClickHouse предлагает более широкий и при этом менее строгий набор типов. В то время как Redshift требует от пользователей указывать возможную длину строк, даже если она переменная, ClickHouse снимает это ограничение и нагрузку с пользователя, храня строки в виде байтов без кодирования. Тип String в ClickHouse, таким образом, не имеет ограничений по длине и не требует её явного указания.
Кроме того, пользователи могут использовать Arrays, Tuples и Enums — типы,
отсутствующие в Redshift как полноценные сущности (хотя Arrays/Structs можно
имитировать с помощью 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 | Гео-типы данных (функциональность развита слабее, например нет систем координат — их можно эмулировать с помощью функций) |
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 по умолчанию имеет неограниченную длину, но может быть ограничен по длине с помощью Constraints.
Синтаксис DDL
Ключи сортировки
И в ClickHouse, и в Redshift есть понятие «ключ сортировки», который определяет,
как данные упорядочиваются при сохранении. В Redshift ключ сортировки задаётся с помощью
предложения SORTKEY:
Для сравнения, ClickHouse использует оператор ORDER BY, чтобы задать порядок сортировки:
В большинстве случаев вы можете использовать те же столбцы и тот же порядок ключа сортировки в ClickHouse,
что и в Redshift, при условии, что вы используете тип по умолчанию COMPOUND. Когда данные
добавляются в Redshift, необходимо запускать команды VACUUM и ANALYZE, чтобы переотсортировать
недавно добавленные данные и обновить статистику для планировщика запросов — в противном случае
объём несортированных данных растёт. Для ClickHouse такой процесс не требуется.
Redshift поддерживает несколько удобных механизмов для ключей сортировки. Первый —
автоматические ключи сортировки (с помощью SORTKEY AUTO). Хотя это может быть уместно
на начальном этапе, явное задание ключей сортировки обеспечивает наилучшую производительность
и эффективность хранения, когда ключ сортировки выбран оптимально. Второй — сортировочный ключ
INTERLEAVED, который придаёт равный вес подмножеству столбцов в ключе сортировки, чтобы повысить
производительность, когда запрос использует один или несколько вторичных сортировочных столбцов.
ClickHouse поддерживает явные проекции, которые позволяют добиться
того же конечного результата при несколько иной конфигурации.
Пользователям следует учитывать, что концепция «первичного ключа» означает разные вещи в ClickHouse и Redshift. В Redshift первичный ключ напоминает традиционную концепцию в реляционных СУБД (RDBMS), предназначенную для обеспечения целостностных ограничений. Однако в Redshift они строго не применяются и вместо этого выступают подсказками для планировщика запросов и распределения данных между узлами. В ClickHouse первичный ключ обозначает столбцы, используемые для построения разреженного первичного индекса, который обеспечивает упорядочивание данных на диске, максимизируя эффективность сжатия и избегая засорения первичного индекса и нерационального расхода памяти.