Redshift 压缩建议不同于分析压缩
Redshift compression recommendations differ from analyze compression
我的 Redshift 集群向我展示了一些与压缩相关的建议,例如:
ALTER TABLE "schema"."table" ALTER COLUMN "field_a" ENCODE lzo;
但是当我这样做时:
ANALYZE COMPRESSION schema.table;
输出显示如下:
table,id,az64,0.00
table,date,raw,0.00
table,field_a,lzo,0.00
table,field_b,lzo,0.00
table,field_c,zstd,41.92
table,field_d,zstd,36.95
table,field_e,zstd,84.74
table,field_f,az64,0.00
如您所见,field_a
是 AWS
仪表板中推荐的字段,估计受益率为 0%,甚至更多,该字段已经用 lzo
压缩类型,所以这不是真正的推荐。
另一方面,不在推荐范围内的其他字段将受益于应用压缩的巨大百分比。
为什么这个 redshift
推荐只关注一个领域而 analyze
声明 returns 不同的结果?
如果我在 field_c
、field_d
和 field_e
申请 ENCODE
,收益将在 I/O disk workload
和 disk usage
,但数据或查询速度会受到不良影响还是完全无害?
由于 Redshift 在这方面有很多系统,所以有很多事情需要检查。首先,控制台推荐的年龄是多少? table 是否也启用了“自动 Table 优化”?
Analyze compression 只是看起来如果压缩发生变化,列可以减少到的大小。所以只是关于大小,正如你正确指出的 IO 带宽。改进可能为 0% 的原因可能是由于数据如何分成 1MB 的块,并且通过使数据更小(至少在 table 的当前大小)没有块被保存。
控制台推荐是一种“更智能”的算法 - 它不仅仅关注数据大小,而且会尝试做出“安全”的推荐或更改。改进压缩会降低性能的主要原因是降低块元数据的效率。因此,如果一个列经常用作 WHERE 子句,Redshift 将避免推荐额外的压缩。我还没有看到它足够聪明,可以查看元数据影响并将它们与 IO 带宽改进进行正确比较。所以当它不确定的时候它就会害羞。
在这些其他列的情况下,分析压缩表明可能会节省大量大小,这可能是 Redshift“害羞”。这些列是否用作 WHERE 子句?特别是启用元数据比较的简单 WHERE 子句 (col = value)。仅仅因为 Redshift 不建议对编码进行这些更改并不意味着这些更改不好(或好,或中性)。它只是不够了解/不够聪明。有一些方法可以分析这些列的元数据并查看不同的编码会对其产生什么影响,但这需要一些努力。 ENCODE RAW 用于常见的、简单的 WHERE 子句列是一个很好的猜测,但确定需要工作。
我的 Redshift 集群向我展示了一些与压缩相关的建议,例如:
ALTER TABLE "schema"."table" ALTER COLUMN "field_a" ENCODE lzo;
但是当我这样做时:
ANALYZE COMPRESSION schema.table;
输出显示如下:
table,id,az64,0.00
table,date,raw,0.00
table,field_a,lzo,0.00
table,field_b,lzo,0.00
table,field_c,zstd,41.92
table,field_d,zstd,36.95
table,field_e,zstd,84.74
table,field_f,az64,0.00
如您所见,field_a
是 AWS
仪表板中推荐的字段,估计受益率为 0%,甚至更多,该字段已经用 lzo
压缩类型,所以这不是真正的推荐。
另一方面,不在推荐范围内的其他字段将受益于应用压缩的巨大百分比。
为什么这个 redshift
推荐只关注一个领域而 analyze
声明 returns 不同的结果?
如果我在 field_c
、field_d
和 field_e
申请 ENCODE
,收益将在 I/O disk workload
和 disk usage
,但数据或查询速度会受到不良影响还是完全无害?
由于 Redshift 在这方面有很多系统,所以有很多事情需要检查。首先,控制台推荐的年龄是多少? table 是否也启用了“自动 Table 优化”?
Analyze compression 只是看起来如果压缩发生变化,列可以减少到的大小。所以只是关于大小,正如你正确指出的 IO 带宽。改进可能为 0% 的原因可能是由于数据如何分成 1MB 的块,并且通过使数据更小(至少在 table 的当前大小)没有块被保存。
控制台推荐是一种“更智能”的算法 - 它不仅仅关注数据大小,而且会尝试做出“安全”的推荐或更改。改进压缩会降低性能的主要原因是降低块元数据的效率。因此,如果一个列经常用作 WHERE 子句,Redshift 将避免推荐额外的压缩。我还没有看到它足够聪明,可以查看元数据影响并将它们与 IO 带宽改进进行正确比较。所以当它不确定的时候它就会害羞。
在这些其他列的情况下,分析压缩表明可能会节省大量大小,这可能是 Redshift“害羞”。这些列是否用作 WHERE 子句?特别是启用元数据比较的简单 WHERE 子句 (col = value)。仅仅因为 Redshift 不建议对编码进行这些更改并不意味着这些更改不好(或好,或中性)。它只是不够了解/不够聪明。有一些方法可以分析这些列的元数据并查看不同的编码会对其产生什么影响,但这需要一些努力。 ENCODE RAW 用于常见的、简单的 WHERE 子句列是一个很好的猜测,但确定需要工作。