クエリ API を使用してエンティティのすべての列を取得することはできません
カテゴリ: パフォーマンス
影響の可能性: 高い
現象
すべての列を取得すると、次のことが発生する可能性があります:
- 取得するデータの量によって起こるパフォーマンスの問題
- 意図しないプラグイン/プロセス実行
ガイダンス
最良のパフォーマンスを得るためには、Microsoft Dataverse のクエリを実行時に、アプリケーションが必要とるす最小量のみを選択する必要があります。
ColumnSet パラメーター
IOrganizationService.Retrieve メソッドを使う時、指定したインスタンスに ColumnSet 列の columnSet
パラメーターを設定します。 QueryExpression セットを使う時、ColumnSet の必要な属性のプロパティを使用します。
以下はその例です。
QueryExpression の ColumnSet(文字列パラメーター[] 列)コンストラクター オーバーロード。
var query = new QueryExpression("account") { ColumnSet = new ColumnSet("name", "address1_city") }; var results = service.RetrieveMultiple(query);
RetrieveRequest の ColumnSet(文字列パラメーター[] 列)コンストラクター オーバーロード。
var entity = service.Retrieve("account", Guid.NewGuid(), new ColumnSet("name", "address1_city"));
ColumnSet AddColumn(String) メソッドの呼び出し。
var query = new QueryExpression("account"); query.ColumnSet.AddColumn("name"); query.ColumnSet.AddColumn("address1_city"); var results = service.RetrieveMultiple(query);
ColumnSet AddColumns(String[]) メソッドの呼び出し。
var query = new QueryExpression("account"); query.ColumnSet.AddColumns("name", "address1_city"); var results = service.RetrieveMultiple(query);
以下のクラスは ColumnSet インスタンスを含みます。
- ConvertQuoteToSalesOrderRequest
- GenerateInvoiceFromOpportunityRequest
- GenerateQuoteFromOpportunityRequest
- GenerateSalesOrderFromOpportunityRequest
- RetrieveAllChildUsersSystemUserRequest
- RetrieveBusinessHierarchyBusinessUnitRequest
- RetrieveMembersTeamRequest
- RetrieveRequest
- RetrieveSubsidiaryTeamsBusinessUnitRequest
- RetrieveSubsidiaryUsersBusinessUnitRequest
- RetrieveTeamsSystemUserRequest
- RetrieveUnpublishedRequest
- RetrieveUserSettingsSystemUserRequest
- ReviseQuoteRequest
- SearchByBodyKbArticleRequest
- IOrganizationService.Retrieve
- QueryExpression
問題となるパターン
AllColumns プロパティが true
である定義済みの ColumnSet を含むクエリは、SQL を発行するようにプラットフォームに指示します。 クエリプランに含まれるすべての物理データに対して "選択 *" にコマンドを入力します。 このシナリオは回避する必要があります。
警告
これらのシナリオを回避する必要があります。
ColumnSet AllColumns セッターのメソッド呼び出し。
var columns = new ColumnSet(); columns.AllColumns = true; var query = new QueryExpression("account"); query.ColumnSet = columns; var results = service.RetrieveMultiple(query);
ColumnSet (allColumns ブール値) コンストラクター オーバーロード。
var query = new QueryExpression("account") { ColumnSet = new ColumnSet(true) }; var results = service.RetrieveMultiple(query);
RetrieveRequest の ColumnSet (allColumns ブール値) コンストラクター オーバーロード。
var entity = service.Retrieve("account", Guid.Parse("bec45132-392a-4617-b935-a64ef04738e4"), new ColumnSet(true));
追加情報
Dynamics 365 からデータを取得するために実行されたクエリは、すべての列を選択する必要があります。 特定のサーバーの役割を個々の列の場合は、クエリに関連付けられた ColumnSet インスタンスを指定してください。 エンティティのすべての列を検索するとパフォーマンスに悪い影響を与える可能性があります。 加えて、作業していない列を検索して更新プログラムを出すことによって、意図せずにプラグイン登録イベントをトリガーすることがあります。
参照
ColumnSet Class
QueryExpression を使用して列を選択する
QueryExpression を使用したデータのクエリ
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。