-
そのテーブルのすべての行を削除する場合、最も簡単なオプションは、テーブルを切り捨てることです。
TRUNCATE TABLE LargeTable GO
テーブルを切り捨てると、テーブルが空になります。WHERE句を使用して削除される行を制限することはできず、トリガーは起動されません。
-
一方、データの80〜90%を超えるデータを削除する場合、たとえば、合計1,100万行があり、1,000万行を削除する場合は、これらの100万行(保持するレコード)を挿入する方法があります。 )別のステージングテーブルに。この大きなテーブルを切り捨てて、これらの100万行を挿入し直します。
-
または、アクセス許可/ビュー、または基になるテーブルとしてこの大きなテーブルを持つ他のオブジェクトがこのテーブルを削除しても影響を受けない場合は、これらの比較的少量の行を別のテーブルに取得し、このテーブルを削除して、同じもので別のテーブルを作成できますスキーマを作成し、これらの行をこのex-Largeテーブルにインポートして戻します。
-
私が考えることができる最後のオプションの1つは、データベースの
Recovery Mode to SIMPLE
に変更することです。 次に、次のようなwhileループを使用して、小さなバッチの行を削除します。DECLARE @Deleted_Rows INT; SET @Deleted_Rows = 1; WHILE (@Deleted_Rows > 0) BEGIN -- Delete some small number of rows at a time DELETE TOP (10000) LargeTable WHERE readTime < dateadd(MONTH,-7,GETDATE()) SET @Deleted_Rows = @@ROWCOUNT; END
リカバリモードを完全に戻すことを忘れないでください。完全に有効にするには、バックアップを取る必要があると思います(変更モードまたはリカバリモード)。