1

顧客の連絡先に関する情報を記録するテーブルがあります。テーブルは「最近の」連絡先としてのみ定義されており、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つの方法を考えてきました。

  1. 上記のテーブルをスキャンして3週間より古いものを削除するバックグラウンドデータベースジョブを定期的に(たとえば5時間ごとに)実行します。

  2. ストアドプロシージャの呼び出しで、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)がより良いオプションだと考えました。

他の人はどう思う?一般的に、データ保持ポリシーを実施するためのベストプラクティスは何ですか?

4

2 に答える 2

2

1)を実行します。オプション2)は誤った考えです。定期的な仕事を避ける理由はありませんが、古いエントリを検索するコストですべての挿入物を罰することを避ける理由はたくさんあります。また、不運だったため、INSERTが応答時間の急上昇にランダムにぶつかるのはさらに罰せられます。いくつかのエントリをクリーンアップするための宝くじの勝者。一方、スケジュールされたジョブは、都合の良い時間にスケジュールすることができます。そして、最後になりましたが、メンテナンスを行うには、「賢い」設計ではINSERTが必要であると考えてください。

やがて、インデックスの転換点の問題により、保持期間後のデータのクリーンアップは実際には非常に難しい問題であり、多くの開発者団体がその道を切り開くことを学びます。また、特に廃止されたデータクリーンアップの問題のために、時系列が時間列ごとのクラスター化インデックスのようになっていることもわかります。

于 2012-04-30T22:40:58.893 に答える
2

私は1)で行きます理由:

  • 古いデータをクリーンアップするための専用のプロセスを用意するのが最善です。2)では、1つのルーチンに2つのプロセスが絡み合っており、1つのプロセスが変更された場合、他の部分を台無しにすることなく、コードのその部分のみを変更する必要があります。
  • 同様に、それがどういうわけか壊れた場合はどうなりますか?2つのプロセスで、何かが戻った場合、必要なトラブルシューティングの労力が2倍になる可能性があります。
  • 何らかの理由(停止、休日、遅い季節)で、誰も新しい行を挿入しない場合はどうなりますか?データは保持ウィンドウの外にありますが、システムに残ります。

コードベースのサイズとデータの全体的な量(私はかなり小さいと思います)に応じて、これらは他の何よりも厄介です(時間の経過とともに量が大幅に増加しない限り...)それでも、「より安全な」戦術を使用すると、良い習慣と慣習。これにより、いつか大量のシステムで作業する必要がある場合、最初のパスで適切に堅牢なコードを生成する可能性が高くなります。

于 2012-04-30T22:41:33.750 に答える