解决方法
检查最小表大小
最小表大小是表在 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 最佳实践
使用自动表优化
列式存储
选择最佳的排序键
查询计划和执行工作流程