我最近开始使用Redshift来容纳数百万个数据点,其模式如下所示:
create table metrics (
name varchar(100),
value decimal(18,4),
time timestamp
) sortkey (name, timestamp);
(真正的架构有点复杂,但这将满足我的问题)
我想知道将度量标准名称(当前为varchar(100))标准化是否有意义,方法是将其映射为整数并仅存储整数。 (例如{id:1,name:metric1})。 name
的基数为~100。通过添加映射,它会使应用程序逻辑变得更加复杂,因为它有许多输入流。此外,提前查询它需要反向映射。
在传统的sql数据库中,这显然是肯定的,但我不确定Redshift如何处理它,因为它是一个柱状数据存储。我认为一般情况下会很好,但我认为Redshift可以/可以在引擎盖下做一些类似的映射,因为任何表中的某些列的基数都低于其他列。
答案 0 :(得分:3)
答案是否定的。 Redshift充分利用了压缩功能,并且可以存储很少的名称字段副本。
但是,您确实需要确保充分利用Redshift的压缩选项。文档中的这一部分应该告诉您需要知道的所有内容:http://docs.aws.amazon.com/redshift/latest/dg/t_Compressing_data_on_disk.html
TL; DR:在表上运行ANALYZE COMPRESSION以查看Redshift建议的压缩,使用这些编码创建新表,并将数据插入该表。
答案 1 :(得分:0)
您最好的选择是继续使用varchar数据类型,就像您在这里一样,但应用" bytedict"压缩类型。在内部,这与创建查找表相同,但它实际上可能更快,因为Redshift本身可以理解管理它自己的表并在列解码期间内部地从int->字符串映射。
以下是bytedict doc参考: http://docs.aws.amazon.com/redshift/latest/dg/c_Byte_dictionary_encoding.html
另一个可以为您的用例提供良好性能/存储节省的选项是runlength: http://docs.aws.amazon.com/redshift/latest/dg/c_Runlength_encoding.html