Power Apps キャンバスアプリのパフォーマンス最適化ガイド
本記事でわかること
接続数の最適化
Power Apps に追加するコネクタは、初期化時に認証とメタデータ取得を実行します。これがアプリ起動時間に大きく影響します。
| コネクタ数 | 推定起動時間 | 評価 |
|---|---|---|
| 1~3個 | 1~2秒 | 優秀 |
| 4~6個 | 2~3秒 | 良好 |
| 7~10個 | 3~5秒 | 許容範囲 |
| 11個以上 | 5秒以上 | 改善推奨 |
実装のポイント
- 複数テーブルは 1 つのコネクタで扱う(例:SQL Server)
- 使用していないコネクタを削除する
- 複数サービスはカスタム API 経由で統合する
OnStart の軽量化と Named Formulas
OnStart はアプリ起動時に必ず実行されます。ここに重い処理があるとユーザー体験が低下します。
OnStart で避けるべき処理
// ❌ 悪い例:起動時に全データを読み込む
ClearCollect(colAllOrders, Filter('Orders', Status = "Active"));
改善されたパターン
// ✅ 良い例:初期化のみ
Set(gbl_UserEmail, User().Email);
Set(gbl_AppLoadTime, Now());
データ読み込みは画面の OnVisible で実行します。また、Power Apps 2023年以降の Named Formulas を使用すれば、遅延評価により不要な計算を削減できます。
// ✅ Named Formulas(遅延評価される)
ActiveOrders = Filter(Orders, Status = "Active");
OrderCount = CountRows(ActiveOrders);
Point!
OnStart では初期化のみ。データ読み込みは画面表示後に実行し、Named Formulas で必要な時だけ評価します。
ギャラリーのパフォーマンス改善
ギャラリーは最もパフォーマンス問題を起こしやすいコンポーネントです。検索・フィルタリング機能の実装方法が重要です。
問題のあるパターン
// ❌ 悪い例:入力の度に検索実行
Gallery1.Items = Filter('Orders', Contains('Name', TextInput1.Value));
改善パターン
// ✅ 良い例:DelayOutput で入力を500ms遅延
Gallery1.Items = Filter('Orders', Contains('Name', TextInput1_DelayOutput.Value));
その他のポイント
- ネストされたギャラリーを避ける
- ルックアップデータは事前にコレクションで読み込む
- SharePoint リストでは委譲フィルタを活用する
- ギャラリーテンプレート内の計算を最小化する
⚠️ 注意
SharePoint には委譲の 500 レコード制限があります。大規模データは Dataverse への移行を検討してください。
SharePoint には委譲の 500 レコード制限があります。大規模データは Dataverse への移行を検討してください。
Concurrent 関数で並列読み込み
複数のデータソースからデータを読む場合、逐次処理ではなく Concurrent 関数で並列実行します。
逐次実行(遅い)
// ❌ 順番に実行(合計 6~9秒)
ClearCollect(colOrders, 'Orders');
ClearCollect(colCustomers, 'Customers');
ClearCollect(colProducts, 'Products');
並列実行(速い)
// ✅ 同時実行(合計 2~3秒で完了)
Concurrent(
ClearCollect(colOrders, 'Orders'),
ClearCollect(colCustomers, 'Customers'),
ClearCollect(colProducts, 'Products')
);
Point!
複数のクエリを Concurrent で並列実行すれば、逐次実行の半分以下の時間で完了します。
コレクションキャッシュ戦略
頻繁にアクセスされるデータをコレクションにキャッシュすれば、毎回のデータベースクエリを削減できます。
// 画面の OnVisible で実行
If(IsBlank(colCachedCustomers),
ClearCollect(colCachedCustomers,
Filter('Customers', Active = true))
);
キャッシュ有効期限の設定
// 15分以上経過したら再読み込み
If(IsBlank(colCachedData) Or
(Now() - gbl_CacheTime > TimeValue("0:15:00")),
Refresh(colCachedData)
);
⚠️ 注意
コレクションはメモリを消費します。10,000件以上の大規模データをキャッシュするとメモリ不足になる可能性があります。
コレクションはメモリを消費します。10,000件以上の大規模データをキャッシュするとメモリ不足になる可能性があります。
まとめ
以下のチェックリストを使用して、パフォーマンス最適化の進捗を確認してください。
| 項目 | 説明 | 実施済み |
|---|---|---|
| コネクタ数の削減 | 10個以下に削減したか | □ |
| OnStart の軽量化 | 初期化のみで、データ読み込みはないか | □ |
| Named Formulas の活用 | 遅延評価が必要な計算式を移行したか | □ |
| ギャラリー検索の最適化 | DelayOutput またはボタンを使用しているか | □ |
| Concurrent の活用 | 複数のデータ読み込みを並列化したか | □ |
| コレクションキャッシュ | 頻繁にアクセスされるデータをキャッシュしているか | □ |
| ネストギャラリーの削除 | ネストされたギャラリーを排除したか | □ |
| 委譲フィルタの活用 | SharePoint で委譲可能なフィルタを使用しているか | □ |
優先度別実施順序
- 優先度 A(必須):OnStart の軽量化、ギャラリー検索の最適化、Concurrent の活用
- 優先度 B(推奨):コネクタ数の削減、Named Formulas への移行、コレクションキャッシュ
- 優先度 C(あると良い):ネストギャラリーの削除、テンプレート内計算の最小化
お気軽にご相談ください
Power Appsのパフォーマンス最適化でお悩みなら、お気軽にご相談ください。
Power Appsのパフォーマンス最適化でお悩みなら、お気軽にご相談ください。