如何在维护历史和当前数据时获得性能?

时间:2009-04-20 05:15:30

标签: database performance database-design postgresql

我想在一张表中保留最近十年的股市数据。某些分析仅需要最近一个月数据的数据。当我进行短期分析时,需要很长时间才能完成操作。

为了解决这个问题,我创建了另一个表来保存当前年份数据。当我从该表中执行分析时,它比前一个快20倍。

现在我的问题是:

  1. 这是为这类问题设置单独表格的正确方法吗? (或者我们使用单独的数据库而不是表格)
  2. 如果我有单独的表有没有办法自动更新辅助表。
  3. 或者我们可以使用非物质化视图之类的东西来获得性能。
  4. 注意:我正在使用Postgresql数据库。

5 个答案:

答案 0 :(得分:5)

你想要table partitioning。这将自动在多个表之间拆分数据,并且通常比手工操作要好得多。

答案 1 :(得分:4)

我正在接近完全相同的问题 表分区绝对是这里的方法。我会分段超过一年,它会给你更大程度的控制。只需设置分区,然后按月(或其他日期)约束它们。在你的postgresql.conf中,你需要将constraint_exclusion = on转为真正获益。这里的另一个好处是,您只能索引您真正想从中提取信息的确切表。如果您批量导入大量数据到此表中,您可能会获得稍微好一点的规则与触发器和分区,我发现规则更容易维护。但对于较小的事务,触发器要快得多。 postgresql手册有一个关于通过继承进行分区的很棒的部分。

答案 2 :(得分:0)

我不确定PostgreSQL,但我可以确认你是在正确的轨道上。处理大数据卷时,将数据分区为多个表,然后使用某种查询生成器构建查询绝对是正确的方法。这种方法在数据仓库中已经很好地建立,特别是在您的案例中,股票市场数据。

但是,我很好奇您为什么需要更新您的历史数据?如果您正在处理股票拆分,通常使用与原始历史数据结合使用的单独乘数表来实现,以提供准确的价格/份额。

答案 3 :(得分:0)

  1. 使用单独的表格作为历史记录是完全明智的。单独的数据库存在问题,因为编写跨数据库查询并不简单
  2. 自动更新 - 这是cronjob的工具
  3. 你可以使用部分索引来做这些事情 - 他们做得很好

答案 4 :(得分:0)

坦率地说,您应该检查执行计划并尝试修复查询或索引,然后再采取更激进的措施。

索引的成本非常低(除非您进行大量插入),现有代码将更快(如果您正确索引)而不进行修改。

其他措施,例如分配......之后......