Power PlatformでDX推進を目指すプロぺリアDX支援のメインビジュアル プロぺリアDX支援

即使える!Power Platform技術紹介

「なるべく短時間で」「効果の高い本質的な知識を」「煩わしい広告なしに」獲得!

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 への移行を検討してください。

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個以下に削減したか
OnStart の軽量化 初期化のみで、データ読み込みはないか
Named Formulas の活用 遅延評価が必要な計算式を移行したか
ギャラリー検索の最適化 DelayOutput またはボタンを使用しているか
Concurrent の活用 複数のデータ読み込みを並列化したか
コレクションキャッシュ 頻繁にアクセスされるデータをキャッシュしているか
ネストギャラリーの削除 ネストされたギャラリーを排除したか
委譲フィルタの活用 SharePoint で委譲可能なフィルタを使用しているか

優先度別実施順序

  • 優先度 A(必須):OnStart の軽量化、ギャラリー検索の最適化、Concurrent の活用
  • 優先度 B(推奨):コネクタ数の削減、Named Formulas への移行、コレクションキャッシュ
  • 優先度 C(あると良い):ネストギャラリーの削除、テンプレート内計算の最小化
⚙️ お気軽にご相談ください
Power Appsのパフォーマンス最適化でお悩みなら、お気軽にご相談ください。

あなたの仕事にも、変化を。

無料相談から、DXの第一歩を踏み出しませんか?

お問い合わせ ブログ一覧