我们的群集是一个4节点群集。我们有一个包含72列的表。当我们查询svv_diskusage表以检查每个切片中的列分配时,我们观察到每个列已分配到2个块(0和1)。但是对于少数列,我们有varchar(1)的数据类型,它不应该占用两个空间块。
如果其中一个列占用多个块(在varchar(1500)的情况下),则可能是为表的所有其他列分配相同的列。如果是,则这将如何影响群集的整体数据库大小。
答案 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还存储每个块中存储的数据的minvalue
和maxvalue
。这在SVV_DISKUSAGE
表格中可见。这些值通常称为区域映射,它们用于标识扫描数据时可以跳过的块。例如,如果WHERE
子句在该列中查找值为5
的行,则可以完全跳过minvalue
6
的块。这在压缩数据时特别有用。
要调查您的数据消耗两个块的原因,请检查:
minvalue
和maxvalue
num_values
)的数量这些值可以让您了解每个块中存储的数据量,以及是否符合您的期望。
另外,请查看表格中使用的分发密钥(DISTKEY
)。如果DISTKEY
设置为ALL
,则会在多个节点之间复制表数据。这也可以解释你的计数。
最后,如果已从表中删除数据,则旧值可能会消耗磁盘空间。在表上运行VACUUM
命令以删除已删除的数据。
一个很好的参考是:Why does a table in my Amazon Redshift cluster consume more disk storage space than expected?