1

我想收集时间序列数据并将其存储在 snappydata 存储中。我将收集数百万行数据,并且我想跨时间片/范围进行查询。

这是我想做的一个示例查询:

select avg(value) 
from example_timeseries_table 
where time >= :startDate and time < :endDate;

所以,我想我想在时间列上使用 PARTITION BY COLUMN 而不是经典的 PRIMARY KEY 列。在我熟悉的其他技术(如 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;
4

1 回答 1

1

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

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

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

于 2016-08-25T10:22:15.103 回答