6
Oracleで非常に大きなレコードセットを削除する最良の方法
私は、非常に大きな(1つのテーブルに5億行を超える1TBに近いデータ)Oracleデータベースバックエンドを持つアプリケーションを管理しています。データベースは実際には何もしません(SProcsもトリガーも何もしません)、それは単なるデータストアです。 毎月、2つのメインテーブルからレコードを削除する必要があります。パージの基準はさまざまで、行の経過時間といくつかのステータスフィールドの組み合わせです。通常、1か月あたり1,000〜5,000万行をパージします(インポートにより、週に約300〜500万行を追加します)。 現在、この削除は約50,000行のバッチで実行する必要があります(つまり、50000の削除、comit、50000の削除、コミット、繰り返し)。バッチ全体を一度にすべて削除しようとすると、データベースが約1時間応答しなくなります(行数によって異なります)。このようなバッチで行を削除することはシステム上で非常に大雑把であり、通常、1週間にわたって「時間の許す限り」それを行う必要があります。スクリプトを継続的に実行できるようにすると、ユーザーが受け入れられないパフォーマンスの低下を招く可能性があります。 この種のバッチ削除もインデックスのパフォーマンスを低下させ、最終的にデータベースのパフォーマンスを低下させる他の影響があると考えています。1つのテーブルに34個のインデックスがあり、インデックスデータのサイズは実際にはデータ自体よりも大きくなっています。 ITスタッフの1人がこのパージを行うために使用するスクリプトを次に示します。 BEGIN LOOP delete FROM tbl_raw where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000; exit when SQL%rowcount < 49999; commit; END LOOP; commit; END; このデータベースは 99.99999%増加している必要があり、年に一度だけ2日間のメンテナンスウィンドウがあります。 これらのレコードを削除するためのより良い方法を探していますが、まだ見つかっていません。助言がありますか?