为什么 AWS 文件大小在 Redshift 和 S3 之间不同?

why AWS file size is different between Redshift and S3?

我正在将 tables 从 Redshift 卸载到 S3 以进行备份。因此,如果我们再次需要它们,我会检查以确保文件完整。

我刚刚在大小为 1,056 的 table 上进行了卸载,根据:

select "table", size, tbl_rows
FROM svv_table_info;

根据文档,大小为 "in 1 MB data blocks",因此此 table 使用 1,056 MB。但复制到 S3 后,文件大小为 154 MB(在 AWS 控制台中查看)。

我复制回 Redshift,所有行都在那里,所以这与“1 MB 数据块”有关。这与它在文件系统中的保存方式有关,是吗?

有人可以解释一下吗?谢谢你。

所以你问为什么 SVV_TABLE_INFO 视图声称 table 消耗 1 GB,但当你将它转储到磁盘时结果只有 154 MB?

主要有两个原因。首先是您正在积极更新 table 但没有清理它。当一行被更新或删除时,Redshift 实际上会追加一个新行(是的,存储为列)并对旧行进行逻辑删除。要收回此 space,您必须 regularly vacuum the table。虽然 Redshift 会在后台进行一些清理,但这可能还不够,或者在您查看时可能还没有发生。

第二个原因是存储 table 数据需要开销。 table 中的每一列都存储为 1 MB 块的列表,每个切片一个块(每个节点多个切片)。根据集群的大小和列数据类型,这可能会导致大量浪费 space.

例如,如果您要存储 32 位整数,一个 1MB 的块可以存储 256,000 个这样的整数,总共需要 4 个块来存储 1,000,000 个值(这可能接近 table). 但是, 如果您有一个 4 节点集群,每个节点有 2 个切片(即 dc2.large),那么您实际上需要 8 个块,因为该列将跨所有切片进行分区。

您可以在STV_BLOCKLIST中看到每列使用的块数。