为什么 Amazon Redshift 集群中的表使用的磁盘存储空间高于或低于预期?

上次更新日期:2020 年 11 月 24 日

在我的经典大小调整之后,表占用的磁盘空间超出预期,或者可用磁盘空间的百分比没有增加。Amazon Redshift 如何计算磁盘存储和表大小?

解决方法

检查最小表大小

最小表大小是表在 Amazon Redshift 集群上的最小占用空间。在分析集群存储使用情况或调整 Amazon Redshift 集群大小时,可以检查最小表大小。

对于使用 KEY、EVEN 或自动 (EVEN) 分配方式创建的表,请使用以下公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments

对于使用 ALL 或自动 (ALL) 分配方式创建的表,请使用以下公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments

对于表格公式,分段数量取决于表是否有定义的排序键。如果 Amazon Redshift 表有定义的排序键,则该表中会有两个段:一个已排序的段和一个未排序的段。如果 Amazon Redshift 表没有排序键,则该表只生成一个未排序的段。

您可以使用以下查询计算已填充的分段数量:

select count(distinct a.slice) as
number_of_populated_slices, b."table" from stv_blocklist a,
svv_table_info b where a.tbl = b.table_id group by b."table" ;

示例:六 dc2.large 集群

例如,创建六 dc2.large 集群时,可以使用四个具有相同结构和行数的小表。如果集群使用三种不同的分配方式,且一种分配方式有排序键,则使用不同的查询。

以下查询将创建一个使用 ALL 分配方式的表(以及六个填充分片的输出):

create table testsize_all (a varchar(100),b varchar(100), c
varchar(100)) diststyle all;
insert into testsize_all values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

以下查询将创建一个使用 EVEN 分配方式的表(以及六个填充分片的输出):

create table testsize_even (a varchar(100),b varchar(100), c
varchar(100)) diststyle even;
insert into testsize_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

以下查询将创建一个包含分配键的表(以及一个已填充分片的输出):

create table testsize_key (a varchar(100),b varchar(100), c
varchar(100)) distkey (a);
insert into testsize_key values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

以下查询将创建一个包含分配键和排序键的表(以及六个已填充分片的输出):

create table testsize_sort_even (a varchar(100),b
varchar(100), c varchar(100) ) diststyle even sortkey (a);
insert into testsize_sort_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

计算最小表大小

要计算 EVEN 分配方式的最小表大小,请使用以下公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36MB

要计算 ALL 分配方式的最小表大小,请使用以下公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36 MB

要计算 KEY 分配方式的最小表大小,请使用以下公式:

Minimum table size = block_size (1 MB) * (number_of_user_columns
+ 3 system columns) * number_of_populated_slices * number_of_table_segments
1MB * (3+3) * 1 *1 = 6MB

要计算包含排序键的 EVEN 分配的最小表大小,请使用以下公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *2 = 72MB

正如计算所示,在插入少量行的情况下,表的大小比预期值更大。随着插入的行数以及填充的分片数量增加,表的大小将继续增长。

执行经典大小调整时,填充的分片数量增长,但表的数据量不增长。因此,调整大小后的可用空间量不会线性增长。