我有一张记录客户联系人信息的表格。该表仅定义为“最近”联系人,我想删除超过 3 周的联系人的所有记录。
例如,该表是:
create table recent_contact {
recent_contact_id int identity (1,1) primary key,
contact_text nvarchar(4000),
created datetime
}
create index createdIndex
on recent_contact (created)
对该表的所有插入都将通过只执行 INSERT 语句的存储过程发生。
我的问题是关于清理的。我想删除所有超过 3 周的项目。到目前为止,我已经想到了两种完成清理的方法。
定期(例如每 5 小时)运行一个后台数据库作业,该作业将扫描上表并删除超过 3 周的任何内容。
在
insert()
存储过程调用中,添加清除旧数据的逻辑。这只会增加恒定的时间开销,因为表是在 [created] 上建立索引的,并且每个项目只插入一次并且只删除一次。所以平均来说这个存储过程会做 1 次插入和 1 次删除。
// insert
insert into recent_contacts (contact_text, created)
values (@text, @createDate)
declare @threeWeeksAgo datetime
set @threeWeeksAgo = DATEADD(DAY, -21, GETDATE())
// remove old items
delete from recent_contacts
where created < @threeWeeksAgo
在这两个选项中,我选择了选项 2),因为我觉得这是一个更优雅的解决方案,并且不需要单独的清理工作。我的同事告诉我,这是一种不好的做法,保留政策应该始终在一个单独的工作中定期运行。即他认为选项 1) 是更好的选择。
我想知道其他人是怎么想的?一般来说,执行数据保留策略的最佳实践是什么?