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 |
ノー ロック
以前のバージョンでは、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 を使用して行を数える
アンチ パターンのクエリ