カテゴリ: パフォーマンス
影響の可能性: 高い
現象
すべての列を取得すると、次のことが発生する可能性があります:
- 取得するデータの量によって起こるパフォーマンスの問題
- 意図しないプラグイン/プロセス実行
ガイダンス
最良のパフォーマンスを得るためには、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 クラス
QueryExpression を使用して列を選択する
QueryExpression を使用したデータのクエリ