[英]What's the best way to return a sample of data over the a period?
假設我有一個包含 3600 個文檔的集合——過去一小時每秒一個——每個文檔都有兩個字段: timestamp
和value
。
選擇此數據樣本(例如 12 個文檔,間隔 5 分鍾)的最佳(閱讀:最高性能)方法是什么? 還是 60 個文檔,每分鍾一個?
實際上,這個集合會有幾千萬條記錄,而且查詢會經常運行,所以性能真的很關鍵。 使用兩個字段上的索引,按timestamp > {one hour ago}
過濾的查詢在具有 200,000 條記錄的集合上相對較快。
這篇文章已經通過在 ArangoDB 中在一段時間內從大型數據集中聚合平均步數來獲得成功。
我會這樣做:
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
end 是周期的結束。
以上返回時間段內每 5 分鍾時間片的第一個文檔。 如果您想要每分鍾一次,請將公式中的300
更改為60
。 如果您想要的不是第一個文檔,而是該時間片開始后 X 秒的文檔,您也可以將0
更改為其他值。
可以幫助提高速度的一件事是,如果您將時間戳存儲在基於秒的 Unix 時間戳中,因為這樣公式可能會更簡單: doc.timestamp % 300 == 0
每個文檔需要更少的計算。
正如評論中提到的,在timestamp
上使用永久索引,這將顯着加快第一個過濾器行。
對此的簡短回答是:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.