这是重新提交我的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%确定这是否是一种'正确'的方式。
你能告诉我如何加快查询过程吗?
答案 0 :(得分:4)
听起来你想要一种方法组合。
首先,您应该查看表分区。这会在多个存储单元(“文件”)之间存储单个表,但仍然为您提供单个表的灵活性。 (这是postgres文档http://www.postgresql.org/docs/current/interactive/ddl-partitioning.html)。
您可能希望按天或通过股票代码进行分区。我的第一反应是按时间(日/周/月),因为这是更新的单位。但是,如果您只通过单个股票代码进行分析,并且通常会跨越多天,则可以使用该代码进行分析。
分区后,您可能需要考虑索引。但是,我怀疑分区会解决您的性能问题。
由于您的更新是在晚上,因此您应该使用更新折叠摘要过程。例如,应在此过程中计算one_minute_std。您可能会发现最好将夜间数据加载到临时表中,对one_minute_std等摘要进行计算,然后将数据加载到最终的分区表方案中。
如果列数如此之多,那么您的分区方案可能比索引方案更好。特别是,索引具有空间开销,并且每行中的记录越小,使用索引的开销就越大,扫描整个表的开销就越大。