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. まとめ
説明は以上です。もっとうまい方法があれば教えてください。
さんのコメント: さんのコメント: