これを、ログを切り捨てるステートメントを含むバッチに入れることに加えて、次のトリックを試すこともできます。
- 他の条件に加えて、クラスター化インデックスの最初の列に一致する条件を追加します
- テーブルからインデックスを削除し、可能であれば削除が完了した後にそれらを元に戻し、DB で行われている他の処理に干渉しないようにしますが、クラスター化されたインデックスは保持します。
上記の最初の点については、たとえば、PK がクラスター化されている場合、各バッチを削除する行数とほぼ一致する範囲を見つけて、それを使用します。
DECLARE @max_id INT, @start_id INT, @end_id INT, @interval INT
SELECT @start_id = MIN(id), @max_id = MAX(id) FROM My_Table
SET @interval = 100000 -- You need to determine the right number here
SET @end_id = @start_id + @interval
WHILE (@start_id <= @max_id)
BEGIN
DELETE FROM My_Table WHERE id BETWEEN @start_id AND @end_id AND <your criteria>
SET @start_id = @end_id + 1
SET @end_id = @end_id + @interval
END