FetchXML 要求のパフォーマンスを向上させる

注意

エンティティとテーブルの違いがわかりませんか? Microsoft Dataverse で「開発者: 用語を理解する」を参照してください。

FetchXML 要求の LateMaterialize オプションで、このようなリクエストをより小さく、より使いやすいセグメントに分割できます。これにより、長時間実行される FetchXML リクエストのパフォーマンスを向上させることができます。

注意

パフォーマンスの向上は、各関係するテーブルとリンク済みテーブルのデータ分散に依存します。 マテリアライズが遅れると、必ずしもパフォーマンスが向上するとは限りません。 既存のフェッチ要求でパフォーマンスの問題が発生している場合に最適です。

特定の数の最上位テーブル レコードに対して従来のフェッチを実行すると、フィルター条件を満たす選択リストのすべての列がプルされます。 フィルター条件を満たす 100 列と 100,000 行あるテーブルで上位 500 レコードをプルする例を使って説明します。 このリクエストは、次の 2 つの方法で問題を引き起こす可能性があります。

  • クライアントに戻るときに 500 行の選択リストに入力するだけでよい場合でも、99.500 行はすべての列をプルします。

  • クエリオプティマイザは、子列を取得するときに任意の順序を生成する可能性があるため、不要なデータ順序が発生します。

LateMaterialize を使用する場合は、次のようなフェッチを作成します。

  • 最初に指定したレコードの上位数のプライマリ ID のみをプルします。

  • 取得したプライマリ ID に基づいて、必要なデータの列のみを選択します—たとえば、フォームに表示するために必要な列は 5 列だけです。

プライマリ ID が収集された後に必要なデータのみをプルすることにより、現在の操作に必要のないデータが除外されるため、取得がはるかに高速になります。

これは、次の場合に最も有益です:

  • クエリを実行しているテーブルには、列データの他のテーブルへのリンクが 1 つ以上あります。

  • テーブルには多くの列が含まれています。

  • テーブルには論理列が含まれています。

構文

<fetch version="1.0" output-format="xml-platform" latematerialize="true"
 mapping="logical" distinct="true">

  <entity name="[entity]">
    <attribute name="[attribute]" />

    <link-entity name="[entity]" from="[linked entity]" to="[linked entityid]"
                 link-type="outer" alias="[alias]">
      <attribute name="[name of linked entity column]" />
    </link-entity>

    <filter type=[filter type]>
      <condition attribute="[column]" operator="[operator]" value="[value]"/> 
    </filter>
  </entity>

</fetch>

サンプル

<fetch version="1.0" output-format="xml-platform" latematerialize="true"
       mapping="logical" distinct="true">

  <entity name="account">
    <attribute name="accountnumber" />
    <attribute name="createdby" />
    <attribute name="ownerid" />

    <link-entity name="account" from="accountid" to="parentaccountid"
                 link-type="outer" alias="oaccount">
      <attribute name="createdby" />

      <link-entity name="account" from="accountid" to="accountid" link-type="outer"
                 alias="oaccount1">
        <attribute name="createdby" />
        <attribute name="accountid" />
        <attribute name="name" />
      </link-entity>
    </link-entity>

    <link-entity name="account" from="accountid" to="accountid" link-type="outer"
                 alias="oaccount2"/>

    <filter type='and'>
      <condition attribute="statecode" operator="eq" value="2"/> 
    </filter>
  </entity>

</fetch>

クエリヒントの FetchXML サポート

Microsoft SQL Server はクエリを最適化するためのいくつかのクエリ ヒントをサポートします。 FetchXML 言語はクエリヒントをサポートし、これらのクエリオプションを SQL Server に渡すことができます。

重要

クエリヒント機能は、FetchXML が SQL に変換される方法を完全に理解している開発者のみが使用することをお勧めします。 これは、この機能を使用する開発者が不注意によるパフォーマンスの低下を回避できるようにするためです。

構文

<fetch version='1.0' aggregate='true' output-format='xml - platform'
mapping='logical' options='OptimizeForUnknown,DisableRowGoal,Recompile'>

  <entity name='account'>

    <attribute name='accountid' aggregate='countcolumn' alias='countAll'/>
    <filter type='and'>
      <condition attribute='statecode' operator='eq' value='0' />
    </filter>

    <filter type='or'>
      <condition attribute='name' operator='like' value='%Test%' />
      <condition attribute='accountnumber' operator='like' value='%Test%' />
      <condition attribute='emailaddress1' operator='like' value='%Test%' />
      <condition attribute='telephone1' operator='like' value='%Test%' />
    </filter>

  </entity>
</fetch>

サポートされているクエリ オプション

サポートされている FetchXML クエリ ヒントを次のテーブルに示します。 この表には、FetchXML クエリヒントから SQL Server クエリヒントへの変換も示されています。

FetchXML ヒント SQL Server ヒント
OptimizeForUnknown 不明に最適化
ForceOrder 強制注文
再コンパイル 再コンパイル
DisableRowGoal DISABLE_OPTIMIZER_ROWGOAL
EnableOptimizerHotfixes ENABLE_QUERY_OPTIMIZER_HOTFIXES '
LoopJoin ループ結合
MergeJoin マージ結合
HashJoin ハッシュ結合
NO_PERFORMANCE_SPOOL NO_PERFORMANCE_SPOOL
ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS ENABLE_HIST_AMENDMENT_FOR_ASC_KEYS

関連項目

FetchXML の使用によるクエリの作成
ヒント (Transact-SQL) - クエリ

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。