AWS Redshift 列式存储与分布方式
Posted
技术标签:
【中文标题】AWS Redshift 列式存储与分布方式【英文标题】:AWS Redshift columnar storage vs distribution style 【发布时间】:2017-10-19 18:21:01 【问题描述】:我一直在查看 AWS 文档,但似乎无法理解分发方式的工作原理以及该数据如何存储在 Redshift 上。我了解什么是列式存储数据库,但是当我阅读有关 Redshift 分布样式的文档时,我对数据如何存储在节点上感到困惑。分布方式就是将新加载的数据按行分布到计算节点的切片上。
例如,EVEN 分配方式定义为:
均匀分布
领导节点将行分布在一个切片中 循环方式,无论任何特定的值如何 柱子。当表没有时,均匀分布是合适的 参与 join 或 KEY 之间没有明确选择时 分布和所有分布。均匀分布是默认的 分发方式。
如果数据是按行分布的,那么数据究竟如何存储到列式存储中。数据分发到计算节点后,列式存储是否生效?
以下是讨论列式存储和分布样式的 AWS 文档的链接:
Columnar Storage Distribution Styles【问题讨论】:
【参考方案1】:每个 Amazon Redshift 集群都有多个节点。每个节点都分为 slices,分配有 CPU 和磁盘存储空间。
表中的每一列都是单独存储的,因此具有 3 列的表每个切片至少需要 3 个块。这就是 Redshift columnar 的原因——每一列都是单独存储的。
每个块的大小为 1 MB,并且是独立压缩的。
见:Why does a table in my Amazon Redshift cluster consume more disk storage space than expected?
分布键决定了哪些行存储在哪些切片上。请记住——每个切片对表中的每一列都有自己的存储空间,但行分布在切片之间。 (除了 ALL 的分布,它将每一行放入每个节点。)
在切片上特定列的存储中,数据根据排序键进行排序。
【讨论】:
现在说得通了。关键信息是“每个切片对表中的每一列都有自己的存储空间,但行分布在切片之间”。因此,如果有两个表,每个表有 3 列,那么每个切片至少需要 6 个块,对吗? 没错!对于小表来说效率不高,但数据仓库的表中通常有数十亿行,最有效的方法是分发数据以进行并行处理。以上是关于AWS Redshift 列式存储与分布方式的主要内容,如果未能解决你的问题,请参考以下文章
为啥像 Snowflake 和 Redshift 这样的列式数据库不能更改列顺序?