Amazon redshift 所有列占用相同磁盘空间的红移表

Amazon redshift 所有列占用相同磁盘空间的红移表,amazon-redshift,Amazon Redshift,作为ETL过程的一部分,我已经用红移创建了许多小的临时表。每个表有50-100行(平均)和约100列。当我查询每个暂存表需要多少磁盘空间时,所有列占用的空间都完全相同。占用的空间远远超过所需的空间。例如,59个布尔值为6MB。我尝试了多种排列方式: 列数据类型(varchar、timestamp等) 列编码(lzo、bytedict等) 加载样式(单独插入、深度复制等) 在上述所有步骤之间重复真空 这些临时表所需的空间量似乎没有任何变化。为什么RedShift不更积极地压缩这些表?我可以在红

作为ETL过程的一部分,我已经用红移创建了许多小的临时表。每个表有50-100行(平均)和约100列。当我查询每个暂存表需要多少磁盘空间时,所有列占用的空间都完全相同。占用的空间远远超过所需的空间。例如,59个布尔值为6MB。我尝试了多种排列方式:

  • 列数据类型(varchar、timestamp等)
  • 列编码(lzo、bytedict等)
  • 加载样式(单独插入、深度复制等)
  • 在上述所有步骤之间重复真空
这些临时表所需的空间量似乎没有任何变化。为什么RedShift不更积极地压缩这些表?我可以在红移中配置它吗?还是我应该强迫所有的东西都放在一个大的暂存台上

我使用此查询确定磁盘空间:

select name
    , col
    , sum(num_values) as num_values
    , count(blocknum) as size_in_mb
from svv_diskusage
group by name
    , col

由于红移中的块大小为1MB,所有列将至少占用每列1MB的空间。最重要的是,如果DISTSTYLE为偶数,则数据库中的每个切片将接近一个块。由于无法在红移中调整块大小,因此无法减少下面空表的大小(列数)*(每列包含数据的切片)*1MB。

基本上

对于使用键或偶数分布样式创建的表:

Minimum table size = block_size (1 MB) * (number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments
Minimum table size = block_size (1 MB) * (number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments
对于使用“全部”分布样式创建的表:

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

number\u of_table\u segments
对于未排序的表是
1
,对于使用排序键定义的表是
2

我想我意识到了我的错误:因为列的最小块大小是1MB,所以我的表的最小大小必须是1MB*(列数)。我可以通过为DISTKEY选择一个常量值来减少大小,但这不是一个大的减少。是的,这就是原因。即使只有一条记录发送到该节点,一列也需要1MB。(因此,如果您有很多节点,那么在达到某个阈值(即填充1MB块)之前,表大小将一直膨胀)。