在Redshift中,只能将一列指定为排序键。我想知道为什么面向列的DBMS会有这样的限制。
离。我们说我有一张这样的桌子:
rowid name age
1 Kevin 20
2 Jill 35
3 Billy Bob 19
DB内部将分别存储每个列,可能是这样的:
Kevin:1,Jill:2,Billy Bob:3
20:1,35:2,19:3
我认为可以单独对它们进行排序,并按照自己的顺序进行排序等。
答案 0 :(得分:1)
Redshift旨在处理大量记录,并快速计算分析。调整到事务工作负载的较小数据库的许多设计模式不能以该规模工作。例如,OLTP中的排序键是使用复制数据的索引实现的。在小规模的数据(GB)上,这不是一个大问题,但是有大量数据(TB和PB),它就是。
Redshift中排序键的主要用途是允许DB最小化磁盘IO读取次数,这非常慢。这是小规模DB与大规模DB之间差异的另一个例子。如果1M记录的操作耗时100ms,则1B记录需要100秒,36B记录需要1小时。 Redshift允许通过管理每个1MB压缩数据块的每列的最小值和最大值的映射来查询数十亿条记录。如果对该块的数据进行了排序,则可以根据WHERE子句过滤器忽略大多数块。
这就是为什么要定义排序键列(请注意,您可以有多个列)的原因,以匹配您在WHERE子句中使用的列(例如,Date)。
Compound和Interleaved都可以支持多个列,但是使用Compound可以定义排序的顺序,并且使用interleaved它们是交错的,它们之间没有顺序。