【问题标题】:How to gain performance when maintaining historical and current data?在维护历史和当前数据时如何获得性能?
【发布时间】:2010-10-20 12:00:42
【问题描述】:

我想在一个表中保存过去十年的股市数据。某些分析只需要最近一个月的数据。当我做这个短期分析时,完成操作需要很长时间。

为了克服这个问题,我创建了另一个表来单独保存当年的数据。当我从这张表中执行分析时,它比上一张快 20 倍。

现在我的问题是:

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

注意:我使用的是 Postgresql 数据库。

【问题讨论】:

    标签: database performance database-design postgresql


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        1. 为历史记录使用单独的表格是非常明智的。单独的数据库问题更大,因为编写跨数据库查询并不简单
        2. 自动更新 - 它是 cronjob 的工具
        3. 您可以对此类事情使用部分索引 - 它们做得很好

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            坦率地说,在采取更激进的步骤之前,您应该检查您的执行计划并尝试修复您的查询或索引。

            索引的成本非常低(除非您进行大量插入操作),并且您现有的代码会更快(如果您正确索引)而无需修改它。

            其他措施,如分区之后......

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-21
              • 1970-01-01
              相关资源
              最近更新 更多