时间序列表中PARTITION BY的哪些列?

时间:2016-08-25 06:16:32

标签: snappydata

我想收集时间序列数据并将其存储在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;

1 个答案:

答案 0 :(得分:1)

当单个分区包含所有数据时,单个处理器会处理该数据,并导致分布式处理丢失。实际上,如果您有时间序列数据,大多数情况下您将查询保持最新时间范围的节点,而其余的计算容量则处于空闲状态。如果您希望在不同时间范围内进行并发查询,那么它可能没问题,但大多数时候情况并非如此。

假设您正在使用行表,另一种加速查询的方法是在时间列上创建索引。

SnappyData支持对行表进行分区修剪。如果你决定采用你在这里提到的方式,时间戳列的分区修剪应该可以工作。