2012-04-19 63 views
1

目前我有一個項目(用Java編寫),它從微控制器讀取傳感器輸出,並使用Hibernate每秒將其寫入多個Postgres表。總共我每秒鐘寫出大約130列的數據。一旦數據被寫入,它將永遠保持靜態。這個系統在當前條件下似乎表現良好。訪問數據庫中平均靜態數據的最佳方式(休眠,Postgres)

我的問題是關於在未來查詢和平均數據的最佳方法。我認爲有幾種方法可行,但我正在尋找哪種方法可以擴展和表現最好。

因爲我們每秒收集和寫入數據,我們每個月最終會產生超過250萬行。我們目前通過寫入JChart2D的JDBC select語句(即選擇壓力,溫度,速度FROM數據WHERE time_stamp BETWEEN startTime AND endTime)繪製該數據。用戶必須注意不要指定太長的時間段(startTimem和endTime delta < 1天),否則他們將不得不等待幾分鐘(或更長時間)才能運行查詢。

未來的目標是建立類似於Google財經可視化API的用戶界面。關於時間縮放,即數據變得「更平滑」(或更平均)的時間段越長。如下所示

選項我已考慮:

選項A:使用SQL AVG函數的平均數據點返回給用戶。如果用戶要求查看半年的數據,我認爲這個選項會變得昂貴。我想象這種情況下的界​​面會根據用戶的請求將行數增加到平均水平。 I.E.如果用戶要求一個月的數據,那麼接口將請求每86400行的平均值,這將返回約30個數據點,而如果用戶要求數據一天,接口將請求平均每2880行的平均值,這也將返回30個數據點,但粒度更細。

選項B:使用SQL以一定的時間間隔返回所有行並使用Java接口平均數據。我已經簡單地測試了這個踢腿,我知道它很貴,因爲我要返回86400行/天的間隔時間請求。我不認爲這是一個可行的選擇,除非我在執行SQL選擇時沒有考慮到這一點。

選項C:由於所有這些數據在寫入後都是靜態的,所以我考慮使用Java程序(使用Hibernate)來編寫平均數據表以及它當前正在寫入的數據。在這個選項中,我有幾個「積累」數據的java類,然後對它進行平均並以指定的間隔(5秒,30秒,1分鐘,1小時,6小時等)將它寫入表中。未來的用戶界面繪圖程序將採用用戶指定的時間間隔,並確定要查詢哪個平均值表。這個選項似乎會造成很多冗餘並佔用更多的存儲空間,但是(在我看來)會產生最佳性能?

選項D:來自經驗豐富的社區的建議?

+0

我不要求代碼,我尋求建議或意見... – babcoccl 2012-04-19 17:26:13

+0

這顯然不是編寫代碼的問題。這是一個使用哪些工具以及組織地將代碼放在哪裏的問題。 +1只是因爲... – JayC 2012-04-19 17:56:04

+0

謝謝,根本沒有尋找代碼或甚至是深入的描述,只是從那些比我有更多經驗的人那裏尋找意見。我的意思是這樣的事情一定是在對錯之前完成的? – babcoccl 2012-04-19 18:21:23

回答

1

一旦您有大量數據需要傳遞,選項A不會趨向於很好地擴展;與A相比,期權B可能會開始相對較慢並且規模更差。選項C是一種通常稱爲「物化視圖」的技術,您可能希望以這種或那種方式實現最佳性能和可伸縮性。雖然PostgreSQL還不支持聲明性物化視圖(但我個人今年正在處理這個視圖),但有辦法通過觸發器和/或計劃任務到達那裏。

爲了保持插入速度快,您可能需要而不是想要嘗試維護主表上的觸發器的任何視圖。您可能想要做的是定期將細節彙總到crontab作業(或類似的)的彙總表中。您可能還希望通過使用已創建的彙總表來創建視圖來顯示彙總數據,並與彙總表不存在的詳細信息表一起使用。

如果你的分區你的原始數據按日期範圍,物化視圖方法可能對你更好。無論如何,這可能是一個非常好的主意。

http://www.postgresql.org/docs/current/static/ddl-partitioning.html

+0

感謝您的提示!現在我瞭解要研究什麼。 – babcoccl 2012-04-20 13:11:56