最近,我开始使用Redshift为数百万个数据点安装一个模式,如下所示:
create table metrics (
name varchar(100),
value decimal(18,4),
time timestamp
) sortkey (name, timestamp);(真正的模式稍微复杂一些,但这将满足我的问题)
我想知道,通过将我的度量名映射到一个整数,并且只存储该整数,使其规范化(目前是varchar(100))是否合理。(例如{id: 1,名称: metric1})。name的基数是100。通过添加映射,它将使应用程序逻辑更加复杂,因为它有许多输入流。而且,提前查询需要反向映射。
在传统的sql数据库中,这显然是肯定的,但我不确定Redshift是如何处理这个问题的,因为它是一个柱状数据存储。我认为总体上这样做是很好的,但我假设Redshift会/可以在幕后执行一些类似的映射,因为任何表中的某些列的基数都比其他列低。
发布于 2014-06-23 10:16:46
答案是否定的。Redshift很好地利用了压缩,并且会存储很少的名称字段的副本。
但是,您确实需要确保您正在很好地利用Redshift的压缩选项。文档中的这个部分应该告诉您您需要知道的所有信息:disk.html
TL;DR:对您的表进行分析压缩,查看Redshift建议的压缩内容,使用这些编码创建一个新表,并将数据插入到该表中。
发布于 2016-07-21 20:33:04
您最好的选择是像这里一样继续使用varchar数据类型,但是应用"bytedict“压缩类型。在内部,这与创建查找表是一样的,但实际上它可能更快,因为Redshift本机在列解码过程中从int->string内部理解管理它自己的表和映射。
下面是字节码文档引用:encoding.html
另一个可以为用例节省性能/存储的选项是运行长度:encoding.html。
https://stackoverflow.com/questions/24318653
复制相似问题