如何有效保存&还原过去三个月的数据并删除旧数据?

时间:2017-02-20 06:05:30

标签: sql database postgresql

我正在使用PostgreSQL。我需要从数据库中删除所有事务数据(最近三个月的事务数据除外),然后将数据恢复到新数据库,并将已创建/更新的时间戳更新为现在的时间戳。此外,必须将过去三个月的更多数据记录到一个数据中(例如,来自甲方的所有发票必须与甲方分组为一张发票)。其他规则是,如果数据仍是过去三个月数据引用的外键,则不得删除数据,只将创建/更新的时间戳更改为现在的时间戳。

我的SQL查询不好,所以现在我正在使用这个策略:

  1. 首先在删除(所有数据)之前创建回顾数据(保存在其他临时表中)。
  2. 然后删除除最近三个月以外的所有数据。
  3. 接下来在删除后创建回顾数据。
  4. 从(所有数据 - 删除数据后)创建回顾数据,以便获得与过去三个月之前的数据完全相同的回顾数据。
  5. 然后将recap数据插入表中。所以旧数据是干净的+在数据库中有回顾数据。
  6. 所以我的策略是只使用相同的数据库而不是创建新的数据库,因为使用该程序导入数据的进程非常慢(因为有900 ++表)。

    但客户端不希望使用此策略,因为他希望数据在新数据库中创建并告诉我使用其他方式。所以问题是:从某些日期清除数据库(使用日期过滤)并回顾旧数据的真实和正确程序是什么?

1 个答案:

答案 0 :(得分:1)

首先,除非您使用时间戳列跟踪行,否则无法找出何时将行添加到表中。

这是您必须进行的第一个更改 - 向所有相关列添加时间戳列,以跟踪创建行的时间(或根据需要更新行)。

然后你有两个选择:

    时间戳列的
  • Partition表,以便您每月(例如)每个月有一个分区。
    优势:很容易摆脱旧数据:只需删除分区即可 缺点: PostgreSQL中的分区很棘手。它会变得有些easier to handle in PostgreSQL v10,但潜在的问题仍然存在。

  • 使用质量DELETE来摆脱旧行。这很容易实现,但是大规模删除确实很糟糕(表格和索引膨胀可能需要VACUUM (FULL)REINDEX,这会影响可用性)。