顧客の連絡先に関する情報を記録するテーブルがあります。テーブルは「最近の」連絡先としてのみ定義されており、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週間以上経過したアイテムをすべて削除したいのですが。これまで、クリーンアップを実行する2つの方法を考えてきました。
上記のテーブルをスキャンして3週間より古いものを削除するバックグラウンドデータベースジョブを定期的に(たとえば5時間ごとに)実行します。
ストアドプロシージャの呼び出しで、
insert()
古いデータを消去するロジックを追加します。テーブルは[作成済み]でインデックス付けされ、各アイテムは1回挿入され、1回だけ削除されるため、これにより一定時間のオーバーヘッドが追加されるだけです。したがって、平均して、このsprocは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つのオプションのうち、オプション2)を選択しました。これは、よりエレガントなソリューションであり、個別のクリーンアップ作業を必要としないためです。私の同僚は、これは悪い習慣であり、保持ポリシーは常に定期的に実行される別のジョブに含める必要があると私に言いました。つまり、彼はオプション1)がより良いオプションだと考えました。
他の人はどう思う?一般的に、データ保持ポリシーを実施するためのベストプラクティスは何ですか?