【问题标题】:Redshift table with all columns consuming same disk space所有列占用相同磁盘空间的 Redshift 表
【发布时间】:2016-05-10 17:27:21
【问题描述】:

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

  • 列数据类型(varchar、timestamp 等)
  • 列编码(lzo、bytedict 等)
  • 加载样式(单独插入、深拷贝等)
  • 在上述所有步骤之间重复 VACUUM

似乎没有任何改变这些临时表所需的空间量。为什么 RedShift 不更积极地压缩这些表?我可以在 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 *(列数)。我可以通过为 DISTKEY 选择一个恒定值来减小大小,但这并不是大幅度减小。
  • 是的,这就是原因。即使只有一条记录进入该节点,一列也将占用 1 MB。 (所以,如果你有很多节点,你的表大小会膨胀,直到你达到一个阈值,即填满 1 MB 块)。

标签: amazon-redshift


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    基本上,

    对于使用 KEY 或 EVEN 分布样式创建的表:

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

    对于使用 ALL 分布样式创建的表:

    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 对于未排序的表是 1,对于使用排序键定义的表是 2

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2023-01-04
      • 2013-11-02
      • 2015-04-06
      • 1970-01-01
      • 2015-04-05
      相关资源
      最近更新 更多