2012-05-14 82 views
2

這是重新提交我的previous question數據庫實現幫助:時間序列數據

我已下令時間序列數據(股票分鐘的價格信息)的集合。我目前使用PostgreSQL的數據庫結構如下:

symbol_table - 在那裏我保留與symbol_id作爲主鍵(串行)的符號列表。 time_table, date_table - 時間/日期值存儲在那裏。 time_id/date_id是主鍵(串行/串行)。

我的主要minute_table包含其中 date_id|time_id|symbol_id是主鍵(從相應的表還外鍵)

使用這個主minute_table我執行不同的統計分析,並保持其結果在一個單獨的表分鐘的價格信息,如one_minute_std - 保留一分鐘的標準偏差量度。

我每天晚上都會用最新的收盤價當前價格信息更新表格。

在當前的實現中,我的表格包含所有符號,每個符號大約有50m記錄。主鍵被編入索引。

如果我想查詢all the symbols where closing price > x and one_minute_std >2 and one_minute_std < 4 for the specific date,搜索大概需要3-4分鐘。

爲了加速這個過程,我正在考慮將每個符號分隔到自己的表中,但不是100%確定這是否是一種「正確」的方式。

你能否告訴我如何加快查詢過程?

回答

4

這聽起來像你想要的方法組合。

首先,你應該看看錶分區。這將跨多個存儲單元(「文件」)存儲單個表,但仍然爲您提供單個表的靈活性。 (這裏是postgres文檔http://www.postgresql.org/docs/current/interactive/ddl-partitioning.html)。

您希望按天或按股票代碼進行分區。我的第一反應是按時間(日/周/月),因爲這是更新的單位。但是,如果您的分析僅由單個股票代碼進行分析,並且經常會跨越數天,那麼就會有一個參數用於替代。

分區後,您可能需要考慮索引。但是,我懷疑分區將解決您的性能問題。

由於您的更新是在晚上進行的,因此您應該在彙總過程中使用更新進行摺疊。例如,在這個過程中應該計算one_minute_std。您可能會發現最好的夜間數據加載到一個臨時表,做摘要,如one_minute_std計算,然後將數據加載到最後的分區表方案。

由於有這麼幾個列這麼多行,你可能比索引模式一個很好的分區方案更好。特別是,索引具有空間開銷,並且每行中的記錄越小,使用該索引的開銷就越大,相當於掃描整個表的開銷。

+0

謝謝你的回答!我將在我的db上實現這個。 – Timka

+0

不幸的是,由於創建1000個分區(每個符號)沒有加快數據庫的速度,所以我無法提高速度...尋找不同的解決方案,可能的NoSQL解決方案 – Timka