Amazon Redshift表块分配

时间:2016-11-21 10:51:07

标签: amazon-redshift

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

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

1 个答案:

答案 0 :(得分:0)

每个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的行,则可以完全跳过minvalue 6的块。这在压缩数据时特别有用。

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

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

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

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

最后,如果已从表中删除数据,则旧值可能会消耗磁盘空间。在表上运行VACUUM命令以删除已删除的数据。

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