我有一个增长很大的pgsql表。 我想旋转它使用cron作业 – 数据仅用于生成报告,一两个星期后,它不是必需的。
正确的做法是设置表分区。
http://www.postgresql.org/docs/8.2/static/ddl-partitioning.html
您在列上build立检查约束,然后使用由该检查驱动的规则将插入到父表中的行引导到多个子表中的一个。 你的情况,我build议每周分区。 如果您想让用户查询单个分区,您只需按照逻辑的方式命名分区 – 比如说2009_week_32或2009_august_week_1,然后让它们针对正确的表发出查询。
如果您希望他们一起查询多个表,则可以设置跨多个表执行联合select的视图,然后用户查询该视图。
如果要删除不再需要的数据,只需更改表即可更改规则并删除包含旧数据的表。
这比disabledog的答案要多一点,但是这个技术在其他数据库引擎中相当普遍。 在时间戳列上使用“删除位置”的缺点是在大型表上可能需要很长时间,而且数据被写入日志。 截断旨在解决期刊写作问题,但不能指定一个where子句。 放下桌子很快,因为你不处理单个行。
您将需要进行某种维护来设置规则以涵盖将来的date。 有些人每月编写脚本(如果下一个月的分区存在,只需在月底前5天查看,如果不是创build它并执行alter table magic来更改规则),而其他人则只需设置几个月或几年的规则并提前每季度/每年手动进行维护工作。
我的想法是改变这个表的架构来logging数据插入的时间戳。
ALTER TABLE blah ADD COLUMN entry_time timestamp DEFAULT current_timestamp;
这样一来,目前创build表格的东西不需要改变。
那么你是cron可以只是这个命令(应与postgres 8.x工作,但我没有运行服务器确认抱歉)
psql -c "DELETE FROM blah WHERE entry_time < (current_timestamp - interval '14 days') RETURNING *;" > deletelog.$( date "+%Y%m%d").log
编辑:我忘了提及“RETURNING *”位让psql返回所有已删除行的全部细节以及通常的“N行删除”,所以这个日志可以用一点awk的魔术重新插入数据,如果删除过早。 而且,审计日志自动删除总是一个好主意。