跳到主要内容
跳到主要内容

Amazon Redshift SQL 转换指南

数据类型

在 ClickHouse 与 Redshift 之间迁移数据的用户会立刻注意到,ClickHouse 提供的类型范围更广,而且限制更少。Redshift 要求用户指定字符串的可能长度,即使是可变长度;而 ClickHouse 通过以原始字节的形式存储字符串,取消了这一限制和负担。因此,ClickHouse 的 String 类型没有长度限制或长度声明要求。

此外,用户可以利用 ArrayTupleEnum——这些在 Redshift 中并不存在为一等公民(尽管可以通过 SUPER 模拟 Array/Struct),这也是用户常见的痛点。ClickHouse 还允许在查询时,甚至在表中,将聚合状态持久化保存。这样可以对数据进行预聚合,通常使用物化视图,从而显著提升常见查询的性能。

下面我们为每种 Redshift 类型给出对应的 ClickHouse 类型映射:

RedshiftClickHouse
SMALLINTInt8 *
INTEGERInt32 *
BIGINTInt64 *
DECIMALUInt128, UInt256, Int128, Int256, Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S), Decimal256(S) - (支持高精度和大取值范围)
REALFloat32
DOUBLE PRECISIONFloat64
BOOLEANBool
CHARString, FixedString
VARCHAR **String
DATEDate32
TIMESTAMPDateTime, DateTime64
TIMESTAMPTZDateTime, DateTime64
GEOMETRY地理数据类型
GEOGRAPHY地理数据类型(目前功能相对不完善,例如尚不支持坐标系——可以借助函数进行模拟)
HLLSKETCHAggregateFunction(uniqHLL12, X)
SUPERTuple, Nested, Array, JSON, Map
TIMEDateTime, DateTime64
TIMETZDateTime, DateTime64
VARBYTE **StringBitEncoding 函数组合使用
* ClickHouse 此外还支持具有扩展取值范围的无符号整数类型,即 UInt8UInt32UInt32UInt64
**ClickHouse 的 String 类型默认不受长度限制,但可以通过使用 约束(Constraints) 将其限定为特定长度。

DDL 语法

排序键

ClickHouse 和 Redshift 都有“排序键”的概念,用于定义数据在存储时的排序方式。Redshift 使用 SORTKEY 子句来定义排序键:

CREATE TABLE some_table(...) SORTKEY (column1, column2)

相比之下,ClickHouse 使用 ORDER BY 子句来指定排序顺序:

CREATE TABLE some_table(...) ENGINE = MergeTree ORDER BY (column1, column2)

在大多数情况下,只要你使用默认的 COMPOUND 类型,就可以在 ClickHouse 中使用与 Redshift 相同的排序键列及其顺序。向 Redshift 添加数据后,应当运行 VACUUMANALYZE 命令,对新添加的数据重新排序并更新供查询规划器使用的统计信息——否则,未排序空间会不断增长。ClickHouse 无需执行这样的过程。

Redshift 为排序键提供了几个便捷功能。其一是自动排序键(使用 SORTKEY AUTO)。虽然这在入门阶段可能比较合适,但当排序键设计合理时,显式指定排序键可以确保获得最佳的性能和存储效率。第二个是 INTERLEAVED 排序键,它对排序键中某个列子集赋予相同权重,以在查询使用一个或多个次级排序列时提升性能。ClickHouse 支持显式的 projections,通过略有不同的配置方式达到相同的效果。

用户应当注意,“primary key” 概念在 ClickHouse 和 Redshift 中代表的含义不同。在 Redshift 中,primary key 类似传统关系型数据库(RDBMS)中用于强制约束的主键概念。不过,这些约束在 Redshift 中并不会被严格强制执行,而是作为查询规划器以及节点间数据分布的提示。在 ClickHouse 中,primary key 表示用于构建稀疏主索引的列,用来确保数据在磁盘上的有序性,在避免主索引被“污染”和浪费内存的同时最大化压缩率。