我想将每一秒的值存储到一个表中。因此,我互相测试两个方法。如果我理解正确,数据应该在内部存储几乎相同。
宽行
CREATE TABLE timeseries (
id int,
date date,
timestamp timestamp,
value decimal,
PRIMARY KEY ((id, date), timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC) AND
compaction={'class': 'DateTieredCompactionStrategy'}
and compression = { 'sstable_compression' : 'DeflateCompressor' };
瘦行
CREATE TABLE timeseries(
id int,
date date,
"0" decimal, "1" decimal,"2" decimal, -- ... 86400 decimal values
-- each column index is the second of the day
PRIMARY KEY ((id, date))
)
测试:
在我的测试中,用于窦功能的瘦行方法仅占用了100万个值的一半存储空间。即使是随机测试也很重要。有人可以解释这种行为吗?
答案 0 :(得分:2)
这些架构之间的唯一区别是单元格键
宽行模型的样本单元格:
["2017-06-09 15\\:05+0600:value","3",1496999149885944]
| | | |
timestamp column value timestamp
Skinny行模型的示例单元格:
["0","3",1497019292686908]
| | |
column value timestamp
您可以清楚地看到宽行模型单元格键是值的时间戳值和列名称。而对于瘦模型,单元格键只是列名。
宽行模型的开销是时间戳(8个字节)和列名(值)的大小。你可以保持列名小,而不是使用时间戳,使用int并输入当天的秒数,如你瘦的行列名。这将节省更多空间。