我正在使用PostgreSQL。我需要从数据库中删除所有事务数据(最近三个月的事务数据除外),然后将数据恢复到新数据库,并将已创建/更新的时间戳更新为现在的时间戳。此外,必须将过去三个月的更多数据记录到一个数据中(例如,来自甲方的所有发票必须与甲方分组为一张发票)。其他规则是,如果数据仍是过去三个月数据引用的外键,则不得删除数据,只将创建/更新的时间戳更改为现在的时间戳。
我的SQL查询不好,所以现在我正在使用这个策略:
所以我的策略是只使用相同的数据库而不是创建新的数据库,因为使用该程序导入数据的进程非常慢(因为有900 ++表)。
但客户端不希望使用此策略,因为他希望数据在新数据库中创建并告诉我使用其他方式。所以问题是:从某些日期清除数据库(使用日期过滤)并回顾旧数据的真实和正确程序是什么?
答案 0 :(得分:1)
首先,除非您使用时间戳列跟踪行,否则无法找出何时将行添加到表中。
这是您必须进行的第一个更改 - 向所有相关列添加时间戳列,以跟踪创建行的时间(或根据需要更新行)。
然后你有两个选择:
Partition表,以便您每月(例如)每个月有一个分区。
优势:很容易摆脱旧数据:只需删除分区即可
缺点: PostgreSQL中的分区很棘手。它会变得有些easier to handle in PostgreSQL v10,但潜在的问题仍然存在。
使用质量DELETE
来摆脱旧行。这很容易实现,但是大规模删除确实很糟糕(表格和索引膨胀可能需要VACUUM (FULL)
或REINDEX
,这会影响可用性)。