ArangoDB 返回一段时间内的数据样本的最佳方式是什么?

voase2hg  于 2022-12-09  发布在  Go
关注(0)|答案(2)|浏览(148)

假设我有一个包含3600个文档的集合(最后一个小时每秒一个),每个文档都有两个字段:timestampvalue中的一个或多个。
什么是最好的(读:性能最佳)的方法来选择这些数据的样本,比如说,12个文档,间隔5分钟?或者60个文档,每分钟一个?
实际上,该集合将有数千万条记录,并且查询将经常运行,因此性能确实是关键。通过对两个字段进行索引,在具有200,000条记录的集合上,按timestamp > {one hour ago}筛选的查询相对较快。
此帖子已由Aggregating averages from large datasets for number of steps over period of time in ArangoDB接替。

to94eoyn

to94eoyn1#

我会这样做:

FOR doc IN Samples
FILTER doc.timestamp > @start AND doc.timestamp < @end
FILTER FLOOR(doc.timestamp/1000) % 300 == 0
RETURN doc

timestamp被假定为基于毫秒的Unix时间戳,类似于DATE_NOW()函数返回的值。
其中@start是时段的开始时间戳,@end是时段的结束时间戳。
上面的函数返回周期中每个5分钟时间段的第一个文档。如果您希望每分钟一个文档,请将公式中的300更改为60。如果您不需要第一个文档,而是需要从该时间段开始X秒后的文档,也可以将0更改为其他值。
有一件事可以帮助提高速度,那就是如果你把时间戳存储在以秒为基础的Unix时间戳中,因为这样公式会更简单:doc.timestamp % 300 == 0,每个文档所需的计算更少。
正如评论中提到的,在timestamp上使用永久索引,这将显著加快第一个过滤器行的速度。

bgtovc5b

bgtovc5b2#

对此的简短回答是:

LET steps = 24
LET stepsRange = 0..23
LET diff = @end - @start
LET interval = diff / steps

FOR step IN stepsRange
RETURN FIRST(
    LET stepStart = start + (interval * step)
    LET stepEnd = stepStart + interval

    RETURN FIRST(
        FOR f IN filteredObservations
        FILTER f.timestamp >= stepStart AND f.timestamp <= stepEnd
        COLLECT AGGREGATE temperature = AVG(f.temperature)
        RETURN temperature
    )
)

有关更多细节,请参见我的问题中的答案,并替换为以下问题:https://stackoverflow.com/a/72886996/1138620

相关问题