Redshift table 仅通过添加 DistKey 从 15GB 增长到 185GB

Redshift table grows from 15GB to 185GB just from adding DistKey

我有一个 table 有 1.3 亿条记录。将数据直接转储到未索引的 table 中是 15GB。当我将 table 转储到具有相同结构但具有分发密钥的 table 中时,table 增长到 185GB。我在 AWS 文档中没有看到类似的内容。这是压缩问题吗?

CREATE TABLE mongousages_withkey
(
   serialnumber      varchar(56),
   "run date"        date,
   "run usage id"    char(1016),
   datetime          varchar(37),
   alteryxversion    varchar(16),
   guid              varchar(40),
   "tool name"       varchar(258),
   "tool count"      float8,
   email             char(256),
   "last load date"  date
)
sortkey(serialnumber);    

哦,你 运行 进入这个神奇的问题。

Redshift 有 1 MB 的数据块,因为它是柱状的,所以所有列都单独存储。现在假设您的 table 中有 10 列,因此第一条传入记录占用 10 MB(1 MB * 10 列)。现在,根据您选择的 distkey 和该字段的基数,Redshift 可能会也可能不会将每一列的下一个值存储在第一条记录所在的同一块中。如果它决定将所有列存储在新块中,则意味着您的第二条记录也值 10 MB。因此,1.3 亿条记录有可能膨胀到 (130 m * 10)MB。我认为你的情况并没有这么极端,所以很少有值会分配给已经分配的块,而其他值会分配给新的内存块。

我建议您尝试使用不同的 distkey,因为这个看起来不太好。

当您第一次 COPY 数据时,Redshift 会自动对 new table 应用压缩。 http://docs.aws.amazon.com/redshift/latest/dg/c_Loading_tables_auto_compress.html

您没有在使用 INSERT 加载的版本上指定压缩,因此您没有压缩

运行 ANALYZE COMPRESSION mongousages_withkey; 并根据建议的编码创建一个新的 table。像这样:

CREATE TABLE mongousages_withkey (
    serialnumber      VARCHAR(56)  NULL ENCODE lzo
   ,"run date"        DATE         NULL ENCODE runlength
   ,"run usage id"    CHAR(1016)   NULL ENCODE lzo
   ,datetime          VARCHAR(37)  NULL ENCODE lzo
   ,alteryxversion    VARCHAR(16)  NULL ENCODE lzo
   ,guid              VARCHAR(40)  NULL ENCODE lzo
   ,"tool name"       VARCHAR(258) NULL ENCODE lzo
   ,"tool count"      FLOAT8       NULL ENCODE delta
   ,email             CHAR(256)    NULL ENCODE lzo
   ,"last load date"  DATE         NULL ENCODE runlength
)
DISTSTYLE KEY
DISTKEY(serialnumber)
SORTKEY(serialnumber)
;