Dynamics CRM では、 BULK DELETE 処理やカスタムの一括削除(多重化してエンティティレコードの削除を行う)を行うと削除処理のパフォーマンスがどんどん低下します。fn_CollectForCascadeDelete という巨大なSQL文が頻繁に実行されていたりします。

同様の問題に出会った人がいて、回避方法が次のブログで紹介されていました。

CRM 4.0 bulk delete performance degration
http://sqlapproach.blogspot.com/2009/05/crm-40-bulk-delete-performance.html

DBCC FREESYSTEMCACHE('ALL') コマンドを使用してキャッシュ全体から未使用のすべてのキャッシュ エントリを開放するとよいそうです。

ブログでは、SQL Server Agent を使用して、定期的に DBCC FRESYSTEMCACHE('ALL') を使用していますが、私は諸事情によりジョブの登録をする権限がないので、大量削除処理中にManagement Studio から使用している SQL 文を覚書として書いておきます。SQL 文は 60分間3分ごとに未使用のキャッシュを開放しています。

print 'start time:' + CONVERT(nvarchar(20), GETDATE(), 114)
DECLARE @endtime DATETIME
SET @endtime = DATEADD(minute, 60, GETDATE())
WHILE GETDATE() < @endtime
  BEGIN
    DBCC FREESYSTEMCACHE('ALL');
    WAITFOR DELAY '00:03';
  END
print 'end time:' + CONVERT(nvarchar(20), GETDATE(), 114)

DBCC FREESYTSTEMCACHE('ALL') を実行してキャッシュをクリアするとプロダクション環境ではパフォーマンスに影響があるかもしれないので注意が必要です。