2

这是我之前问题的重新提交:

我有一组有序的时间序列数据(股票分钟价格信息)。我当前使用 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

1 回答 1

4

听起来您想要多种方法的组合。

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

您可能希望按天或按股票代码进行分区。我的第一反应是按时间(日/周/月),因为这是更新的单位。但是,如果您仅通过单个代码进行分析并且通常跨越数天,那么就有理由使用它来代替。

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

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

有这么多行但列这么少,使用良好的分区方案可能比索引方案更好。特别是索引有空间开销,每行中的记录越小,使用索引所产生的开销就越大,相当于扫描整个表。

于 2012-05-15T00:21:38.320 回答