Dynamics CRM 4.0 では、インポートウィザードからエンティティのデータを簡単にインポートできます。通常問題はないのですが、ファイルの書くレコードは importdata というエンティティのレコードに全部蓄積されています。 インポートの一覧からインポートレコードを削除すればこのデータは削除されますが、データの件数が多いと削除に異常に時間を要するようになります。というかほぼ消せなくなります。

インポートしたファイルの各レコードはimportdataというエンティティに格納されています。データを何百万件インポートした場合、 Management Studio から出力できるレポート "上位のテーブルによるディスク使用量" を確認するとimprtDataBase の レコード数やデータがえらいことになっているかもしれません。

上位のテーブルによるディスク使用量はSQL Server Management Studio でオブジェクトエクスプローラからデータベースを右クリックし→レポート→標準レポートから出力できます。

削除をできるように私が普段行っている方法を紹介します。

検証は Dynamics CRM 4.0 Rollup 8 環境で行っています。

1. 現象の整理

最初に現象の原因と対処方法(私なりの)を整理しておきます。

1.1 現象

インポートウィザードで50万件以上など件数の多いデータをインポートすると、インポートレコードの削除に時間がかかるようになる。

1.2 原因(予想)

インポートレコードを削除しようとすると、それに紐づくデータを削除(カスケーディングによる削除)するため時間がかかるようです。さらに削除処理に[DynamicsCRM]Dynamics CRM で大量に削除処理を行うと削除処理が遅くなる の現象が重なるためどんどん遅くなっていると予想しています。

1.3 対処方法(ワークアラウンド)

インポートしたファイルに紐づくimportdata エンティティレコードをあらかじめ削除してから、インポートレコードを削除する。

2. インポートレコードの削除を行えるようにする

対処方法に記載したとおり、削除するインポートレコードに紐づく importdata の一覧を取得し、削除します。

importdata の一覧を取得するには、 インポートレコードのリストを表示します(下図参照)。

対象のレコードをダブルクリックしてインポートファイルのエンティティフォームを表示し、しびURL のクエリパラメタ id の値をメモします(下図のURLの青い背景でフォーカスされた文字列)。このGUID文字列がインポートファイルのIDです。(importfileエンティティの1レコードのID)。

importfile の id がわかったら、SQL Server Management Studio で下図のクエリを発行すると、 削除対象のインポートに紐づく importdata の一覧を取得できます。

-- Management Studio などで一覧を確認する SQL
-- importdataid がインポートしたファイルのレコードを表す
-- レコードID. TOP 1 は適当に加減
SELECT TOP 1 importdataid primaryid, data 
  FROM dbo.importdata
 where importfileid = 'f162abe4-b2e3-de11-a2bf-002264059b58'
   and deletionstatecode != 2

一覧が求まったら、importdata の各レコードは単独で削除できるので、 カスタムプログラムでCrmService.Delete を呼び出して頑張って削除します。importdata は一括削除ジョブで削除できるかもしれませんが、実際に消せるかはまったく未確認+未検証です。

3. まとめ

説明は以上です。もっとうまい方法があれば教えてください。