成熟した Oracle データベース アプリケーション (10 年以上実稼働) があり、その間、不要になった古いデータを削除するために独自に考案したスクリプトを使用してきました。これらは、適切なテーブルに対して削除ステートメントを発行することによって機能し、頻繁なコミットを伴うループで、I/O によるシステムの過負荷や過度の undo スペースの使用を回避します。
ほとんどの場合、それらは正常に機能します。これらは毎日実行され、システムから最も古い日付のデータを削除するのに約 1 時間かかります。私が持っている主な懸念は、このすべての削除がテーブルとインデックスに与える影響と、システムに過度の負荷をかけていなくても、1 日分のデータをその短い時間で削除すると吹き飛ばされるという事実です。インスタンスのバッファ キャッシュを削除すると、キャッシュが徐々に復元されるため、次の数時間は後続のクエリの実行がわずかに遅くなります。
何年もの間、私たちはより良い方法を検討してきました。以前、人々が古いデータのリーピングを管理するためにパーティション分割されたテーブルを使用していたと聞いたことがあります。このアプローチの主な欠点は、リープ ルールが「X 月を削除する」を超えていることです。ユーザーは、キー値に基づいてデータがシステムに保持される期間を指定できます (たとえば、請求書テーブルでは、アカウント foo は 3 か月後に削除できますが、アカウント bar は 2 年間保持する必要がある場合があります)。
参照整合性の問題もあります。Oracle のドキュメントでは、主にテーブルがハイパーキューブである傾向があるデータ ウェアハウスのコンテキストでデータをパージするためのパーティションの使用について説明しています。私たちのものは OLTP の終点に近く、月 X のデータが月 Y のデータと関係を持つことはよくあることです。
キャッシュ ブローアウトについては、専用のバッファ キャッシュの設定について少し読んだことがありますが、ユーザーごとまたはトランザクションごとではなく、テーブルごとのようです。キャッシュを保持するために、一度削除されたデータを保持する必要がないため、リーピング ジョブがいつでも 1 つのトランザクションに相当するデータのみをキャッシュに保持するようにしたいと考えています。
予見可能な将来のために削除を使用して行き詰まっていますか、それともリープに対処するための他のより賢い方法はありますか?