Amazon Redshift 表块分配

Posted

技术标签:

【中文标题】Amazon Redshift 表块分配【英文标题】:Amazon Redshift table block allocation 【发布时间】:2016-11-21 10:51:06 【问题描述】:

我们的集群是一个 4 节点集群。我们有一个由 72 列组成的表。当我们查询 svv_diskusage 表以检查每个切片中列的分配时,我们观察到每列已分配到 2 个块(0 和 1)中。但是对于少数列,我们的数据类型为 varchar(1),它不应该占用两个空间。

是否有可能如果其中一列占用的块多于一个块(在 varchar(1500) 的情况下),则为表的所有其他列分配相同的块。如果是,这将如何影响集群的整体数据库大小。

【问题讨论】:

【参考方案1】:

每个 Amazon Redshift 存储块的大小为 1MB。每个块只包含一个表中一列的数据。

SVV_DISKUSAGE system view 包含这些块的列表,例如:

select db_id, trim(name) as tablename, col, tbl, max(blocknum)
from svv_diskusage
where name='salesnew'
group by db_id, name, col, tbl
order by db_id, name, col, tbl;

db_id  | tablename  | col |  tbl   | max
--------+------------+-----+--------+-----
175857 | salesnew   |   0 | 187605 | 154
175857 | salesnew   |   1 | 187605 | 154
175857 | salesnew   |   2 | 187605 | 154
175857 | salesnew   |   3 | 187605 | 154
175857 | salesnew   |   4 | 187605 | 154
175857 | salesnew   |   5 | 187605 |  79
175857 | salesnew   |   6 | 187605 |  79
175857 | salesnew   |   7 | 187605 | 302
175857 | salesnew   |   8 | 187605 | 302
175857 | salesnew   |   9 | 187605 | 302
175857 | salesnew   |  10 | 187605 |   3
175857 | salesnew   |  11 | 187605 |   2
175857 | salesnew   |  12 | 187605 | 296
(13 rows)

存储每列所需的块数取决于数据量和用于该表的compression encoding。

Amazon Redshift 还会存储每个块中存储的数据的 minvaluemaxvalue。这在SVV_DISKUSAGE 表中可见。这些值通常称为区域地图,用于识别扫描数据时可以跳过的块。例如,如果WHERE 子句在该列中查找值为5 的行,则可以完全跳过具有minvalue6 的块。这在数据压缩时特别有用。

要调查您的数据消耗两个块的原因,请检查:

每个区块的minvaluemaxvalue 每个块中存储的值 (num_values) 的数量

这些值会让您了解每个块中存储了多少数据,以及这是否符合您的期望。

另外,请查看桌面上使用的分发密钥 (DISTKEY)。如果DISTKEY 设置为ALL,则表数据将在多个节点之间复制。这也可以解释你的块数。

最后,如果数据已从表中删除,那么旧值可能会占用磁盘空间。对表运行VACUUM 命令以删除已删除的数据。

一个很好的参考是:Why does a table in my Amazon Redshift cluster consume more disk storage space than expected?

【讨论】:

以上是关于Amazon Redshift 表块分配的主要内容,如果未能解决你的问题,请参考以下文章

Redshift - 提取约束

AWS:通过使用 amazon-data-pipeline 将数据从 S3 传输到 Redshift 来实现除 COPY 之外的其他功能

限制 Amazon Redshift 中架构的大小

Redshift WLM 配置:如何使用未分配的内存?

Python 将数据从 Redshift 加载到 S3

Amazon EMR 与 Amazon Redshift