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

2 分钟阅读
0

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

解决方法

检查最小表大小

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

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

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

对于使用 ALL 或 Auto (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) asnumber_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), cvarchar(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), cvarchar(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), cvarchar(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),bvarchar(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

要计算具有排序键的均匀分配的最小表大小,请使用以下公式:

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

插入少量行后,表的大小会比预期的大。随着插入的行数和填充的切片数的增长,表的大小将继续增长。

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

相关信息

设计表的 Amazon Redshift 最佳实践

使用自动表优化

列式存储

选择最佳的排序键

查询计划和执行工作流程

AWS 官方
AWS 官方已更新 1 年前