我想收集时间序列数据并将其存储在snappydata商店中。我将收集数百万行数据,并且我希望跨时间/范围进行查询。
以下是我想要执行的示例查询:
select avg(value)
from example_timeseries_table
where time >= :startDate and time < :endDate;
所以,我想我想在时间列而不是经典的PRIMARY KEY列上使用PARTITION BY COLUMN。在像Cassandra DB这样我熟悉的其他技术中,使用分区键中的时间列会直接指向分区,并允许在单个节点中而不是跨多个分布式节点提取时间片的数据。
为了保持高效,我假设我需要在此表中按列“时间”进行分区。
example_timeseries_table
------------------------
id int not nullable,
value varchar(128) not nullable,
time timestamp not nullable
PERSISTENT ASYNCHRONOUS
PARTITION BY COLUMN time
这是分区的正确列,用于高效的时间片查询还是我需要在所有列上创建更多列:year_num,month_num,day_num,hour_num列和PARTITION BY COLUMN,然后执行像这样的查询将查询集中到特定的分区节点?:
select avg(value)
from example_table
where year_num = 2016
and month_num= 1
and day_num = 4
and hour_num = 11
and time >= :startDate and time < :endDate;
答案 0 :(得分:1)
当单个分区包含所有数据时,单个处理器会处理该数据,并导致分布式处理丢失。实际上,如果您有时间序列数据,大多数情况下您将查询保持最新时间范围的节点,而其余的计算容量则处于空闲状态。如果您希望在不同时间范围内进行并发查询,那么它可能没问题,但大多数时候情况并非如此。
假设您正在使用行表,另一种加速查询的方法是在时间列上创建索引。
SnappyData支持对行表进行分区修剪。如果你决定采用你在这里提到的方式,时间戳列的分区修剪应该可以工作。