Redshift table 所有列都使用相同的磁盘 space
Redshift table with all columns consuming same disk space
我在 RedShift 中创建了一些小型暂存 table 作为 ETL 过程的一部分。每个 table 有 50-100 行(平均)和 ~100 列。当我查询每个分段 table 需要多少磁盘 space 时,所有列都占用了完全相同数量的 space。 space 的服用量远远超过了需要的量。例如,59 个 BOOLEAN 值需要 6 MB。我尝试了多种排列:
- 列数据类型(varchar、timestamp 等)
- 列编码(lzo、bytedict 等)
- 加载样式(单独插入、深层复制等)
- 在上述所有步骤之间重复 VACUUM
这些暂存 table 所需的 space 数量似乎没有任何变化。为什么 RedShift 不更积极地压缩这些 table?我可以在 RedShift 中配置它吗?或者我应该简单地强制所有内容都在一个大型舞台上 table?
我正在使用此查询来确定磁盘 space:
select name
, col
, sum(num_values) as num_values
, count(blocknum) as size_in_mb
from svv_diskusage
group by name
, col
由于 RedShift 中的块大小为 1MB,因此所有列每列至少占用 1MB。最重要的是,如果 DISTSTYLE 为 EVEN,它将更接近于数据库中每个切片一个块。由于无法在 RedShift 中调整块大小,因此无法减小以下空 table 的大小(列数)*(包含每列数据的切片)* 1MB。
基本上,
对于使用 KEY 或 EVEN 分配方式创建的 tables:
Minimum table size = block_size (1 MB) * (number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments
对于使用 ALL 分发方式创建的 table:
Minimum table size = block_size (1 MB) * (number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments
number_of_table_segments
对于未排序的 table 是 1
,对于使用排序键定义的 table 是 2
。
我在 RedShift 中创建了一些小型暂存 table 作为 ETL 过程的一部分。每个 table 有 50-100 行(平均)和 ~100 列。当我查询每个分段 table 需要多少磁盘 space 时,所有列都占用了完全相同数量的 space。 space 的服用量远远超过了需要的量。例如,59 个 BOOLEAN 值需要 6 MB。我尝试了多种排列:
- 列数据类型(varchar、timestamp 等)
- 列编码(lzo、bytedict 等)
- 加载样式(单独插入、深层复制等)
- 在上述所有步骤之间重复 VACUUM
这些暂存 table 所需的 space 数量似乎没有任何变化。为什么 RedShift 不更积极地压缩这些 table?我可以在 RedShift 中配置它吗?或者我应该简单地强制所有内容都在一个大型舞台上 table?
我正在使用此查询来确定磁盘 space:
select name
, col
, sum(num_values) as num_values
, count(blocknum) as size_in_mb
from svv_diskusage
group by name
, col
由于 RedShift 中的块大小为 1MB,因此所有列每列至少占用 1MB。最重要的是,如果 DISTSTYLE 为 EVEN,它将更接近于数据库中每个切片一个块。由于无法在 RedShift 中调整块大小,因此无法减小以下空 table 的大小(列数)*(包含每列数据的切片)* 1MB。
基本上,
对于使用 KEY 或 EVEN 分配方式创建的 tables:
Minimum table size = block_size (1 MB) * (number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments
对于使用 ALL 分发方式创建的 table:
Minimum table size = block_size (1 MB) * (number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments
number_of_table_segments
对于未排序的 table 是 1
,对于使用排序键定义的 table 是 2
。