我有一张超过1.2亿行的表。
以下命令analyze compression tbl;
显示几乎每个VARCHAR字段的LZO
编码,但我认为runlenght
编码对于具有有限数量的选项(流量来源,类别等)的字段可能更好。
那么我应该将某些字段移动到另一个编码还是继续使用LZO?
答案 0 :(得分:2)
runlength
关于runlength
而不是有限数量的选项的观点是,字段值在许多连续行上重复。当表按该列排序时,通常就是这种情况。但是,你是对的,你拥有的不同值越少,任何特定值在序列中出现的可能性就越大。
Redshift在documentation中声明:
我们不建议对指定为排序键的任何列应用runlength编码。当块包含相似数量的行时,范围限制扫描执行得更好。如果排序键列的压缩程度远高于同一查询中的其他列,则范围限制扫描的执行效果可能会很差。
also:
LZO编码提供非常高的压缩比和良好的性能。 LZO编码特别适用于存储非常长字符串的CHAR和VARCHAR列,尤其是自由格式文本,例如产品描述,用户注释或JSON字符串。
因此,最终,您必须仔细查看您的数据,排序方式,加入其他表格的方式,如果有疑问,基准测试编码即可。创建相同的表两次并将runlength
编码应用于一个表中的列,将lzo
应用于另一个表中。理想情况下,您已经拥有了一个经常使用的查询。为每个表运行几次并比较结果。
您的查询是否正常?然后不要担心编码并采取Redshift的建议。如果您想将其作为学习项目,那么请确保在表中的行加倍(四倍,...)时,您知道性能如何提高或降低。 1.2亿行并不多,很可能现在一个编码看起来很棒但是当某个阈值通过时会导致查询效果不佳。