投稿日:2024/7/5
投稿者:関
今回は、Microsoft の「キャンバスアプリのパフォーマンスを向上させる」資料より、「OnStart プロパティを最適化する」を紹介したいと思います。
実はPL-600の試験勉強中に遭遇するまで、この関数(Concurrent)の存在は知りませんでした。
(後日知りましたが、PL-400のlearnにもありました)
Microsoftのlearn サイト
OnStart プロパティを最適化する
1.ClearCollect 関数の利用(ユーザー セッション中にデータが変わらない場合)
Collect(コレクション)では、データのテーブルを保存できます。
アプリで再利用する目的で大量の構造化データを格納する必要があるときに最適です。
コレクションを使用してパフォーマンスを上げる
コレクションを使用する最も一般的な理由は、データ ソース内の同じテーブルの呼び出しを減らすことでパフォーマンスを最適化することです。
たとえば、あるテーブルにアクティブなプロジェクトがすべて格納されているとき、アプリでそのリストを複数回参照するなら、そのデータを 1 回だけクエリし、データをコレクションに保存することを検討してください。
Projects テーブルのコピーをデータ ソースから collectProjects という名称のコレクションに保存するには、次の数式を使用します。
例:Collect(collectProjects, Projects)
これで、データ ソースの Projects テーブルと同じ行と列を持つ collectProjects という名前のコレクションが作成されます。
コレクションの使用にあたり、次の点を考慮してください。
・Collect 関数は委任できません。
・コレクションは作成後、データ ソースにリンクされません。
・コレクションは一時的なものです。 アプリを終了すると、コレクションとその内容はすべて削除されます。
2.Concurrent 関数の利用(データソースを読み込む処理を使っている場合)
Concurrent 関数を使用すると、コネクタや Dataverse の呼び出しがある場合に、同じプロパティで指定した複数の式を同時に評価できます。
通常、複数の数式は ; (セミコロン) 演算子と一緒にチェーンすることで評価され、それぞれの式が順番に評価されます。
Concurrent 関数では、; 演算子を使用した後でも、アプリがプロパティが含む数式をすべて同時に評価します。
この同時実行機能によって、ユーザーは同じ結果を得るまでの待機時間を短縮できます。
Concurrent 関数なしでは、次の数式は 4 つのテーブルを一度に 1 つずつ読み込みます。
ClearCollect( Product, ‘[SalesLT].[Product]’ );
ClearCollect( Customer, ‘[SalesLT].[Customer]’ );
ClearCollect( SalesOrderDetail, ‘[SalesLT].[SalesOrderDetail]’ );
ClearCollect( SalesOrderHeader, ‘[SalesLT].[SalesOrderHeader]’ )
この例では、4 つのコレクションを作成しますが、コレクションが処理されるのは一度に 1 つとなります。
したがって、ユーザーはアプリが起動するまで 12 秒弱待機する必要があります。
Concurrent 関数で同じ数式を囲むと、操作に必要な全体の時間を減らすことができます。
Concurrent(
ClearCollect( Product, ‘[SalesLT].[Product]’ ),
ClearCollect( Customer, ‘[SalesLT].[Customer]’ ),
ClearCollect( SalesOrderDetail, ‘[SalesLT].[SalesOrderDetail]’ ),
ClearCollect( SalesOrderHeader, ‘[SalesLT].[SalesOrderHeader]’ ))
これで、4 つの式がすべて同時に実行されます。 読み込み時間は 約6秒に短縮されます。
Concurrent は、非同期呼び出しでの長い遅延を回避するのに優れた方法です。
3.Set 関数の利用(検索テーブルからのデータを利用している場合)
Set 関数を使用して検索テーブルからのデータをローカルでキャッシュし、ソースからデータを繰り返し取得するのを回避します。
この方法により、セッション中にデータが変更されなければ、パフォーマンスが最適化されます。
データはソースから 1 回取得され、ユーザーがアプリを終了するまで、ローカルで参照されます。
Set(CustomerOrder, Lookup(Order, id = “123-45-6789”));
Set(CustomerName, CustomerOrder.Name);
Set(CustomerAddress, CustomerOrder.Address);
Set(CustomerEmail, CustomerOrder.Email);
Set(CustomerPhone, CustomerOrder.Phone);
この方法は、連絡先情報、規定値、または頻繁に変更されないユーザー情報などのデータに役立ちます。
また、規定関数や ユーザー関数でもこの手法を使用できます。
まとめ
「キャンバスアプリのパフォーマンスを向上させる」の資料には上記以外にも記載されていますので是非、一読してはいかがでしょうか?
きっと役に立つと思います。
最近のコメント