数据库实施帮助:时间序列数据

时间:2012-05-14 21:11:20

标签: database postgresql database-design time-series

这是重新提交我的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%确定这是否是一种'正确'的方式。

你能告诉我如何加快查询过程吗?

1 个答案:

答案 0 :(得分:4)

听起来你想要一种方法组合。

首先,您应该查看表分区。这会在多个存储单元(“文件”)之间存储单个表,但仍然为您提供单个表的灵活性。 (这是postgres文档http://www.postgresql.org/docs/current/interactive/ddl-partitioning.html)。

您可能希望按天或通过股票代码进行分区。我的第一反应是按时间(日/周/月),因为这是更新的单位。但是,如果您只通过单个股票代码进行分析,并且通常会跨越多天,则可以使用该代码进行分析。

分区后,您可能需要考虑索引。但是,我怀疑分区会解决您的性能问题。

由于您的更新是在晚上,因此您应该使用更新折叠摘要过程。例如,应在此过程中计算one_minute_std。您可能会发现最好将夜间数据加载到临时表中,对one_minute_std等摘要进行计算,然后将数据加载到最终的分区表方案中。

如果列数如此之多,那么您的分区方案可能比索引方案更好。特别是,索引具有空间开销,并且每行中的记录越小,使用索引的开销就越大,扫描整个表的开销就越大。