4

現在、Web サイトから CRM をクエリすると、応答時間が遅い (1 分以上) という問題に直面しています。Web サービスを介して CRM 2011 を使用しています。調査したところ、CRM をクエリする時点で時間が費やされていることがわかりました。

CrmSvcUtil.exe を使用して、CRM エンティティにマップするプロキシ クラスを生成しました。次に、コンテキストのインスタンスを作成し、C# で LINQ を使用して CRM をクエリします。

クエリを実行するときは、LINQ to CRM を使用して親オブジェクトを読み込み、次に LoadProperty を使用して関連する子を読み込みます。

CRM のクエリに別の方法を使用している人がいるかどうか、実装でこのような問題に遭遇したことがあるかどうかを知りたいです。

簡単なサンプル クエリを以下に示します。

    public void SelectEventById(Guid id)
     {
            var crmEventDelivery = this.ServiceContext.EventDeliverySet.FirstOrDefault(eventDelivery => eventDelivery.Id == id);
            if (crmEventDelivery != null)
            {
              this.SelectCrmEventDeliveryWithRelationships(crmEventDelivery);
            }
    }

    private void SelectCrmEventDeliveryWithRelationships(EventDelivery crmEventDelivery)
     {
            // Loading List of Venue Delivery on parent crmEventDelivery thats been passed
            this.ServiceContext.LoadProperty(crmEventDelivery, Attributes.EventDelivery.eventdelivery_venuedelivery);

            foreach (var venueDelivery in crmEventDelivery.eventdelivery_venuedelivery)
            {
                 // Loading Venue on each Venue Delivery
                 ServiceContext.LoadProperty(venueDelivery, Attributes.VenueDelivery.venue_venuedelivery);
            }

            // Loading List of Session Delivery on parent crmEventDelivery thats been passed
            this.ServiceContext.LoadProperty(crmEventDelivery, Attributes.EventDelivery.eventdelivery_sessiondelivery);

            foreach (var sessionDelivery in crmEventDelivery.eventdelivery_sessiondelivery)
            {
              // Loading Presenters on each Session Delivery
              ServiceContext.LoadProperty(sessionDelivery, Attributes.SessionDelivery.sessiondelivery_presenterbooking);
            }
   }
4

5 に答える 5

3

あなたが提供したものに基づいて、これは標準的な遅延読み込みの問題のように見えますが、私の推測では、各遅延読み込みが Web サービスの呼び出しにつながるということです。これは、「おしゃべりな」サービス アーキテクチャと呼ばれます。目標は、1 回のリクエストでデータを取得するためのサービス呼び出しをできるだけ少なくすることです。

呼び出して詳細を入力するのは良い考えのように思えるかもしれません。なぜなら、1 レベルまたは 2 レベルの深さのデータのみが必要な場合、または完全に下にある場合に個々のサービス メソッドを再利用できるが、大幅なパフォーマンス ペナルティを支払うことになるからです。

このようなシナリオでは、完全なオブジェクト グラフを返す Web サービス呼び出しを定義した方がよいでしょう。CRM内のORMレイヤーに使用しているかどうか/何を使用しているかはわかりませんが、配信の完全なグラフを取得するために特定の呼び出しを行うと、ORMはデータをより少ないSQLステートメントに熱心に取得できます. Web サービスへの呼び出しが減ると (そしてその後、CRM のデータ ストアへの呼び出しが減ると)、パフォーマンスが著しく向上するはずです。

于 2012-09-11T01:27:22.280 に答える
1

これで時間がかかる理由がわかります。他の誰もがコメントしているように、かなりの数の Web サービス呼び出しを行っていると思います。時間があれば、個々の呼び出しが遅いのか、それとも単に多くの呼び出しを行っているためなのかを知りたい場合は、これをプロファイリングすることをお勧めします.

いずれにせよ、強い型のエンティティを使用しないことでパフォーマンスが向上すると思います。

FetchXml クエリを使用することをお勧めします。これにより、Sql Xml スタイルのクエリを作成できます。基本的に、多くの we bservice 呼び出しを 1 つの呼び出しに置き換えることができるはずです。MSDNに例があります。また、Stunnware FetchXml デザイナー、[製品] > [Stunnware ツール] > [ダウンロードと評価] も確認してください。Crm 4 用に作成されましたが、必要なほぼすべての機能をサポートしています。

それが気に入らない場合は、 QueryExpressionまたはODataを試すこともできます。どちらも、1 回のヒットでデータを取得できるはずです。

于 2012-09-11T20:04:00.563 に答える