Amazon Redshift SQL 转换指南
数据类型
在 ClickHouse 与 Redshift 之间迁移数据的用户会立刻注意到,ClickHouse 提供的类型范围更广,而且限制更少。Redshift 要求用户指定字符串的可能长度,即使是可变长度;而 ClickHouse 通过以原始字节的形式存储字符串,取消了这一限制和负担。因此,ClickHouse 的 String 类型没有长度限制或长度声明要求。
此外,用户可以利用 Array、Tuple 和 Enum——这些在 Redshift 中并不存在为一等公民(尽管可以通过 SUPER 模拟 Array/Struct),这也是用户常见的痛点。ClickHouse 还允许在查询时,甚至在表中,将聚合状态持久化保存。这样可以对数据进行预聚合,通常使用物化视图,从而显著提升常见查询的性能。
下面我们为每种 Redshift 类型给出对应的 ClickHouse 类型映射:
* ClickHouse 此外还支持具有扩展取值范围的无符号整数类型,即UInt8、UInt32、UInt32 和 UInt64。
**ClickHouse 的 String 类型默认不受长度限制,但可以通过使用 约束(Constraints) 将其限定为特定长度。
DDL 语法
排序键
ClickHouse 和 Redshift 都有“排序键”的概念,用于定义数据在存储时的排序方式。Redshift 使用 SORTKEY 子句来定义排序键:
相比之下,ClickHouse 使用 ORDER BY 子句来指定排序顺序:
在大多数情况下,只要你使用默认的 COMPOUND 类型,就可以在 ClickHouse 中使用与 Redshift 相同的排序键列及其顺序。向 Redshift 添加数据后,应当运行 VACUUM 和 ANALYZE 命令,对新添加的数据重新排序并更新供查询规划器使用的统计信息——否则,未排序空间会不断增长。ClickHouse 无需执行这样的过程。
Redshift 为排序键提供了几个便捷功能。其一是自动排序键(使用 SORTKEY AUTO)。虽然这在入门阶段可能比较合适,但当排序键设计合理时,显式指定排序键可以确保获得最佳的性能和存储效率。第二个是 INTERLEAVED 排序键,它对排序键中某个列子集赋予相同权重,以在查询使用一个或多个次级排序列时提升性能。ClickHouse 支持显式的 projections,通过略有不同的配置方式达到相同的效果。
用户应当注意,“primary key” 概念在 ClickHouse 和 Redshift 中代表的含义不同。在 Redshift 中,primary key 类似传统关系型数据库(RDBMS)中用于强制约束的主键概念。不过,这些约束在 Redshift 中并不会被严格强制执行,而是作为查询规划器以及节点间数据分布的提示。在 ClickHouse 中,primary key 表示用于构建稀疏主索引的列,用来确保数据在磁盘上的有序性,在避免主索引被“污染”和浪费内存的同时最大化压缩率。