次の方法で共有


QueryExpression を使用してパフォーマンスを最適化する

Dataverse クエリを作成する際に一般的に避けるべきことについての指針については、クエリのアンチ パターンを参照してください。 次のセクションは、QueryExpression に固有です。

クエリのヒント

重要

これらのオプションは、Microsoft テクニカル サポートによって推奨された場合にのみ適用してください。 これらのオプションを誤って使用すると、クエリのパフォーマンスが損なわれる可能性があります。

Microsoft SQL Server はクエリを最適化するための多くのクエリ ヒントをサポートします。 QueryExpression は、クエリヒントをサポートし、QueryExpression.QueryHints プロパティ を使用して、これらのクエリオプションを SQL Server に渡すことができます。

クエリ オプション SQL Server ヒント
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

詳細: ヒント (Transact-SQL) - クエリ

ノー ロック

以前のバージョンでは、QueryExpression.NoLock プロパティ を使用してレコードの共有ロックを防止していました。 このプロパティを含める必要はなくなりました

ユニオンのヒント

異なるテーブルの列に ConditionExpression を設定する FilterExpression を追加する場合は、 FilterExpression.FilterHint プロパティunion に設定することで、パフォーマンスを向上させることができます。 ただし、いくつかの制限があります。

  • FilterExpression.FilterOperator は、LogicalOperator.Or を使用する必要があります。
  • 各クエリには union ヒントを 1 つだけ含めることができます。
  • FilterExpression ヒント付きの union フィルターが最上位フィルターにない場合は、Dataverse クエリを変換し、union ヒント付きのフィルターをルート フィルターに移動します。
  • union ヒントの深さが 3 レベルを超える場合、ヒントは無視されます。

以下の例では、アカウント テーブルと コンタクト テーブルの両方で、telephone1 列に union のヒントを持つフィルターを設定しています。

QueryExpression query = new("email")
{
   ColumnSet = new ColumnSet("activityid", "subject"),
   Criteria = new FilterExpression(LogicalOperator.And)
   {
      Conditions = {
         {
            new ConditionExpression(
               attributeName:"subject",
               conditionOperator:ConditionOperator.Like,
               value: "Alert:%")
         },
         {
            new ConditionExpression(
               attributeName:"statecode",
               conditionOperator:ConditionOperator.Equal,
               value: 0)
         }
      },
      Filters = {
         {
            new FilterExpression(LogicalOperator.Or){
               FilterHint = "union",
               Conditions = {
                  {
                     new ConditionExpression(
                        attributeName:"telephone1",
                        conditionOperator:ConditionOperator.Equal,
                        value: "555-123-4567"){
                           EntityName = "ac"
                        }
                  },
                  {
                     new ConditionExpression(
                        attributeName:"telephone1",
                        conditionOperator:ConditionOperator.Equal,
                        value: "555-123-4567"){
                           EntityName = "co"
                        }
                  }
               }
            }
         }
      }
   }
};        

LinkEntity linkToAccount = query.AddLink(
      linkToEntityName: "account",
      linkFromAttributeName: "regardingobjectid",
      linkToAttributeName: "accountid",
      joinOperator: JoinOperator.LeftOuter);
linkToAccount.EntityAlias = "ac";

LinkEntity linkToContact = query.AddLink(
      linkToEntityName: "contact",
      linkFromAttributeName: "regardingobjectid",
      linkToAttributeName: "contactid",
      joinOperator: JoinOperator.LeftOuter);
linkToContact.EntityAlias = "co";

参照

QueryExpression を使用したデータのクエリ
QueryExpression を使用して列を選択する
QueryExpression を使用してテーブルを結合する
QueryExpression を使用して行の順序を決定する
QueryExpression を使用して行をフィルターする
QueryExpression を使用して結果をページングする
QueryExpression を使用してデータを集計する
QueryExpression を使用して行を数える
アンチ パターンのクエリ