如何在關係數據庫中儲存許多小的時間序列?
輸入數據
多個測試床生成各種複雜度的測量數據。
在最基本的形式中,不考慮任何元數據,測試台上的一次測量將是一個小的(1 - 幾千個樣本)時間序列,每個樣本有幾十個通道/信號/屬性。
跨時間和測試台的測量將具有一組相似的信號,但並不總是與為測試設置添加和移除感測器相同。
數據量
目前我們估計我們的數據速率為
6 testbeds x 4 test per hour x 12 hours a day x 4000 samples per test == 1,152,000 samples per day x 365 == 420,480,000 samples per year
_ x 48 columns per sample (currently 32 bit floats, mostly) ~~~ 75 GB per year
(本例中的列是指通道/信號)
如果/當添加更多測試平台時,數據量可能會相應增加。
數據輸入
測試台在本地生成數據,然後將數據非同步導入數據庫。(可能會在一秒鐘內生成幾千個樣本,然後在本地查看,然後刮擦或導入。)
查詢
我們希望查詢主要針對單個測量的聚合。即,您希望找到所有測量值(每個都有 4k 個樣本),其中例如 channel_output_voltage 的平均值在某個範圍內。
數據庫佈局?
為此設置表格的好方法是什麼?需要考慮哪些因素?
從理論上講,我可以每次測量一張表,每年生成 100,000 張表,但這並不是一個好主意。
或者我可以把所有東西都放在一張大桌子上(有數百列),它有空間容納所有通道,並根據需要添加通道:每個樣本一行。未使用的通道保持為 NULL。
MEASUREMENTS ------------ measurement_id } PK time_stamp } channel_1 (may be NULL for a certain measurement_id ...) channel_2 ... channel_n(+1)
或者我可以採用一種方法,讓一個表用於樣本(時間戳)和一個包含所有值的表:(MEASUREMENTS 表中每個樣本一行,SAMPLE_VALUES 表中每個樣本 n 行)
SAMPLES SAMPLE_VALUES ------------ ------------- measurement_id sample_id time_stamp channel_id (links to a channels table where there is a name etc.) sample_id channel_value
還有哪些其他選擇?如何進一步調查我們應該選擇哪個選項?
數據庫產品
由於客戶的限制,我們想把它放在 MS SQLS 或 Oracle 中。
從一個答案:
不要儲存原始數據,只儲存聚合。嚴重地。
這假設有一種有意義的方法可以事前確定客戶想要針對他們的數據執行哪些查詢。沒辦法:-)
您的查詢是否應該收集每個月/年的數據?
您可以使用分區將資訊儲存在不同的物理文件中。當您只需要特定時期的資訊時,分區可以提高 SELECT 語句的速度。http://msdn.microsoft.com/en-us/library/ms345146%28v=sql.90%29.aspx
在 Microsoft SQL Server 中創建分區表時,您還可以在不同的物理位置創建不同的文件組並分別備份它們。
關於你關於數據庫設計的問題,你可能想在這裡閱讀規範化:http ://en.wikipedia.org/wiki/Database_normalization
我們希望查詢主要針對單個測量的聚合 好吧,利用這一點。不要儲存原始數據,只儲存聚合。嚴重地。
好的,您將需要調試您的聚合程式碼。因此,將原始數據保存在磁碟文件中的一些微不足道的共振峰(csv?)中。計劃幾天后扔掉它們。
這將消除您每年 75GB 的要求、每秒 20 次插入的要求等。
每年 100,000 張桌子 壞主意。每當您打開一張桌子時,作業系統都會發出呻吟聲。我已經看到它完成了,但是打開一張桌子需要幾秒鐘到幾分鐘。