如何安全地旋转 postgresql 表?

amo*_*kul 2 database

我有一个 pgsql 表,它变得非常大。我想使用 cron 作业轮换它 - 数据仅用于生成报告,一两周后,就不需要了。

Jam*_*s F 5

正确的方法是设置表分区。

http://www.postgresql.org/docs/8.2/static/ddl-partitioning.html

您在列上建立检查约束,然后使用该检查驱动的规则将插入到父表中的行定向到多个子表之一。对于你的情况,我建议每周进行分区。如果您想让用户查询单个分区,您只需逻辑命名分区 - 例如 2009_week_32 或 2009_august_week_1,然后让他们针对正确的表发出查询。

如果您希望他们一起查询多个表,您可以设置一个视图来跨多个表进行联合选择,然后用户查询该视图。

当您想要删除不再需要的数据时,您只需更改表以更改规则并删除包含旧数据的表。

这比disableleopard的答案要多做一些工作,但该技术在其他数据库引擎中相当常见。仅在时间戳列上使用“删除位置”的缺点是,在大型表上可能需要很长时间,并且数据会写入日志。截断旨在解决日志写入问题,但您无法指定 where 子句。删除表非常快,因为您不处理单独的行。

您将需要进行某种维护来设置涵盖未来日期的规则。有些人每月编写脚本(只需在月底前 5 天检查下个月的分区是否存在,如果不存在则创建它并执行 alter table magic 来更改规则),而其他人则只设置几个月或几年的规则提前并酌情每季度/每年手动执行维护工作。