2010-07-20 159 views
6

我有一個系統,每秒記錄一些測量值。存儲與特定秒對應的值的趨勢數據的最佳方式是什麼?趨勢億+行

1 day = 86.400 seconds 
1 month = 2.592.000 seconds 

大約1000個值用於跟蹤每秒。

目前有50個表格將趨勢數據分成20列。這些表格包含超過1億行。

TREND_TIME datetime (clustered_index) 
    TREND_DATA1 real 
    TREND_DATA2 real 
    ... 
    TREND_DATA20 real 
+1

是趨勢數據會被讀取還是更新很多? – 2010-07-20 08:14:46

+0

您應該指定RDBMS--這是物理數據庫實現的問題,而不是邏輯設計,RDBMS在這裏確實很重要。 – Unreason 2010-07-20 09:29:08

+0

它將被閱讀很多顯示多種圖形。 – kerem 2010-08-21 06:55:20

回答

2

我會改變數據保存方法,而不是將'原始'數據保存爲值,我會在數組中保存5-20分鐘的數據(內存,BL端),使用基於LZ的算法壓縮該數組,然後存儲數據庫中的數據爲二進制數據。另外,最好保存該二進制塊的最大/最小/平均/等等..信息。

當您想要處理數據時,您可以在數據塊之後處理數據塊,並且爲應用程序保留較低的內存配置文件。這種方法稍微複雜一些,但在內存/處理方面可以擴展。

希望這有助於。

+0

這種方法不具可擴展性我認爲,因爲當我想看到一個月的數據時,我必須解壓縮很多。 – kerem 2010-08-21 06:57:30

+0

我知道你的意思。爲了解決這個問題,如果可能的話,對每月/每年的壓縮數據進行摘要並將該摘要存儲在數據庫中。您可能需要存儲代表在基礎數據上完成的不同操作的各種摘要,但您將獲得令人眼花繚亂的速度。 – Gilad 2010-08-22 08:08:34

0

問題是數據庫模式?

1秒鐘到很多趨勢顯然首先顯示一個單獨的表與秒錶外鍵。或者,如果「許多趨勢值」由列而不是行表示,則可以將列附加到秒錶併產生空值。

你試過嗎?性能差嗎?

3

您是否考慮過RRDTool - 它爲時間序列數據提供循環數據庫或循環緩衝區。您可以以任意間隔存儲數據,然後定義合併點和合並函數,例如(給定期間,1秒,5秒,2天等)(總和,最小值,最大值,平均值)。因爲它知道什麼您想要的合併點,它們在聚合後不需要存儲所有數據點。

GangliaCacti在封面下使用它,它很容易從多種語言中使用。

如果您確實需要所有數據點,請考慮僅將它用於聚合。

+0

我絕對贊成這種方法,我使用Ganglia來跟蹤多年來的許多數據系列,它的效果非常好! – 2010-07-29 20:14:07

+0

謝謝,神經節和仙人掌似乎非常有用。但是我找不到RRDTool的C#庫。 – kerem 2010-08-23 14:12:52