0

ロジックに基づいてフィールドの一部を更新することにより、特定のエンティティのレコードを更新する一括更新アプリケーションがあります。起動したくないエンティティの更新にワークフローが添付されているため、レコードの更新にTargetUpdateを使用しています(通常の更新を使用する場合)。しかし、それらのレコードを更新するには永遠に時間がかかります。現在、1Kレコードの更新には約1.5時間かかります。実際のシナリオでは、毎日最大5〜6時間の期間(夜間のジョブ)で約1万件のレコードを更新する必要があります。パフォーマンスを向上させる方法はありますか?

Centity newentityobect;

newentityobect= new Centity()
{
    asp_field1 = new Key()
    {
        Value = new Guid(field1Value)
    },
    asp_field2 = field2Value,
    asp_field3 = field3Value,
    asp_field3 = field4Value
};

TargetUpdateCentity objx = new TargetUpdateCentity();
objx.Centity = newentityobect;
UpdateRequest updateCentity = new UpdateRequest();
updateCentity.Target = objx;
UpdateResponse updatedCentity = (UpdateResponse)crmUpdateObject.Execute(updateCentity);

上記は、レコードを更新するために使用している小さなコードスニペットです。

4

1 に答える 1

0

私の説明はコメントでは長すぎるので、回答として投稿します。
マルチスレッドにはより多くの思考/問題/リスクが伴うことは承知していますが、あなたの好みに合わせて応答が遅すぎる 1 つのサービス コールを見ています。
速度を上げたい場合は、次の 4 つの可能性があります。

  • 一度に複数のサービス呼び出しを行う (マルチスレッド)
  • サービス呼び出しを編集します(基本的なcrmサービスであるため、できないと思います)
  • 別のサービス呼び出しを使用します(存在するとは思えませんが、それを使用して一括更新がある場合はパフォーマンスが向上します)
  • サービスを避けてデータベースを直接編集します(crmがこれをサポートしているとは思えないので、ハックと見なしますが、データベースを直接更新すると速度が大幅に向上する可能性があります)。


一括更新のためのサービス呼び出しがなく、サービスを編集できないと仮定すると、マルチスレッド化するか、データベースに直接アクセスできます。
これらの 2 つの選択肢を考えると、私は間違いなくマルチスレッド アプローチを選択します。これは、データベースへのハッキングよりもはるかに安全なアプローチです。

.NET 4.0以降、次のようなリストでマルチスレッドを簡単に有効にすることができます:

Parallel.ForEach(entityList, entity => {
   //copy paste your looped code here
});

コードを編集して、最終結果が好みすぎるかどうかを確認できます。そうでない場合は、crm へようこそ、神速!

于 2012-05-02T14:49:13.867 に答える