ADVERTISEMENT

【Power Automate】ループが多すぎて遅い時の改善方法

【Power Automate】ループが多すぎて遅い時の改善方法
🛡️ 超解決

Power Automateでフローを実行すると、ループ処理が多くて予想以上に時間がかかり、業務効率が落ちてしまうことがあります。とくに大量のデータを処理するフローや、複数のループが入れ子になっているフローでは、実行時間が数十分から数時間に及ぶケースも珍しくありません。この問題の背景には、各ループの反復回数や内部処理の効率、APIの呼び出し制限など複数の要因が潜んでいます。本記事では、ループが原因で遅いフローを特定し、改善するための具体的な方法を解説します。まず最初に、自分のフローがどのような状況になっているのかを把握するためのポイントを整理します。

【要点】この記事で確認すること

  • 最初に見る場所: フローの実行履歴から各アクションの所要時間とループの反復回数を確認する。とくに「Apply to each」や「Do until」の内部処理時間がボトルネックかを把握します。
  • 切り分けの軸: ループの反復回数が多いのか、ループ内の個々のアクションが遅いのか、あるいはループ自体の設計(入れ子・並列処理・条件分岐)に問題があるのかを切り分けます。
  • 注意点: 会社PCでフローを編集する場合、管理者が設定したコネクタやAPIの制限(呼び出し頻度、同時実行数)に抵触しないよう注意が必要です。また、ループ内でのSharePointやSQLの更新は特に時間がかかるため、バッチ処理に変更するなどの措置を検討してください。

ADVERTISEMENT

1. ループ処理が遅くなる原因を特定する

ループが遅い原因は大きく分けて三つあります。一つ目はループの反復回数そのものが多いことです。例えば1万件のリストをApply to eachで処理すると、当然1万回の繰り返しが発生します。二つ目はループ内のアクションに時間がかかることです。SharePointにアイテムを作成するアクションは1回あたり0.5〜2秒程度かかることがあり、それが繰り返されると膨大な時間になります。三つ目はループの構造そのものの問題です。入れ子ループ(ループの中にさらにループ)は、外側のループが100回、内側が100回なら合計1万回の処理になり、ボトルネックになりやすいです。

これらの原因を特定するには、まず実行履歴を確認します。Power Automateのポータルで該当フローの「実行履歴」を開き、各アクションの「所要時間」と「出力」を調べてください。ループアクション(Apply to eachなど)の内部でどのくらい時間がかかっているか、またループの反復回数がどれだけかを確認できます。もしループのトータル時間がフロー全体の大部分を占めていれば、ループ自体に問題があります。さらにループ内のアクションを個別に開くと、各反復の詳細な時間も見られます。これにより、特定のアクションが異常に遅い場合(例えば毎回2秒以上かかる)も発見できます。

1.1 ループの反復回数が多いケース

例えば、SharePointリストから数千件のアイテムを取得し、それを1件ずつ処理するフローを考えます。Apply to eachを使用すると、アイテムの数だけループが回ります。このとき、リストのアイテム数が増えれば増えるほど、実行時間は線形に増加します。実行履歴でApply to eachの所要時間を確認し、反復回数×1回あたりの平均時間が全体時間に比例していれば、反復回数が原因です。改善策としては、フィルターを使って処理対象を減らす、バッチ処理に変更する、またはループを使わずに一括処理できるアクション(例えば「作成」ではなく「一括作成」など)を探すことが考えられます。

1.2 ループ内のアクションが遅いケース

ループ内でSharePointやSQL Server、Outlookなどのコネクタを使っている場合、1回の呼び出しに時間がかかることがあります。とくに「アイテムの作成」や「行の更新」は、対象システムの応答時間に依存します。ネットワーク遅延やサーバー負荷も影響します。実行履歴で各アクションの所要時間を確認し、特定のアクションだけが他より明らかに長い場合、そのアクションの設計を見直す必要があります。例えば、同じデータを複数回取得しているなら、一度取得して変数に格納して使い回す、あるいはConcurrency設定(並列処理)を調整することで改善できる場合があります。

1.3 入れ子ループや非効率な構造

ループの中にさらにループがある入れ子構造は、非常に遅くなりやすいです。例えば、全ユーザーを取得する外側ループ(100人)と、各ユーザーの全タスクを取得する内側ループ(平均20件)を組み合わせると、合計2000回の処理になります。しかも内側ループで毎回SharePointやSQLにアクセスすると、さらに時間がかかります。改善策としては、最初に一回のアクションで必要なデータをすべて取得してから、メモリ上でループ処理する方法を検討します。また、可能であればループを排除し、フィルタークエリやODataクエリで必要なデータだけを一度に取得します。

原因 確認方法 改善のヒント
反復回数が多い 実行履歴のループアクションで反復回数と所要時間を確認 フィルターで件数を減らす、バッチ処理に変更、一括アクションを利用
ループ内アクションが遅い 各アクションの所要時間を比較、特定のアクションだけ長い 変数にキャッシュ、並列処理の有効化、アクションの代替を検討
入れ子ループ フローの構造を視覚的に確認、ループが二重以上 データを事前に結合、配列変数を活用、ループのネストを解消
API制限・スロットリング アクションのエラーコード(429など)や実行履歴の警告 遅延を入れる、同時実行数を調整、管理者に制限の緩和を依頼

2. ループの設計を見直す具体的な改善手順

原因を特定したら、次に改善を実行します。ここでは実際にフローを編集する手順を説明します。ただし、会社のテナントで管理者の承認が必要な設定(カスタムコネクタやPremiumコネクタ)もあるため、必要に応じて管理者と相談してください。

  1. 反復回数を減らすためのフィルターを追加する
    トリガーの直後やループの前に、「フィルター配列」アクションを使って処理対象を絞り込みます。例えば、作成日が今月のアイテムだけに限定するなどです。また、SharePointの「アイテムの取得」アクションでは、「ODataフィルタークエリ」を設定することで取得件数を減らせます。
  2. Apply to eachの同時実行を有効にする(Concurrency Control)
    ループアクションの設定で「同時実行制御」をオンにし、Degree of Parallelism(並列度)を指定します。デフォルトは1(直列処理)ですが、2や3に増やすことで処理が並列化され、全体の時間が短縮されます。ただし、並列度を上げすぎると、呼び出し先のシステムに負荷がかかったり、レート制限に引っかかる可能性があるため、適切な値を選んでください。
  3. ループ内でのコネクタ呼び出しを減らす
    ループ内で毎回同じデータを取得している場合、事前にループの外で一度だけ取得して変数に格納し、ループ内ではその変数を参照するようにします。例えば、ループ内で「ユーザープロファイルの取得」を毎回行うのではなく、ループ前に全ユーザーを取得して配列変数に入れておきます。
  4. Do untilループをApply to eachに変更する
    条件によって繰り返し回数が変わるDo untilループは、無限ループの危険性があり、また回数が多くなりがちです。可能であれば、あらかじめ回数が決まっているApply to eachに書き換えることで、管理が容易になります。
  5. バッチ処理に分割する
    大量のデータを一度に処理しようとするとタイムアウトや制限に達することがあります。フローを複数のトリガーで分割し、例えば100件ずつ処理するバッチに分けます。これは複雑になりますが、長大なフローを安定させる方法です。

3. ループを排除する代替アプローチ

ループを完全に使わずに処理を実現できる場合があります。Power Automateには、配列を一括処理できるアクションや、コネクタによってはバッチ操作用のアクションが用意されています。例えば、SharePointの「複数のアイテムを作成する(プレミアム)」や、SQL Serverの「ストアドプロシージャの実行」を利用すると、ループを使わずに複数行を一度に処理できます。また、Office 365 GroupsやTeamsのコネクタにも、一括操作のアクションがあるものがあります。これらはループよりも高速で、かつ実行時間も予測しやすくなります。

また、Power Automateの「並列分岐」や「適用 to 各(Apply to each)の同時実行」を使うことで、疑似的な分散処理も可能です。ただし、並列化には注意点もあり、各アクションが同じリソースを更新すると競合が発生します。そのため、更新対象が独立している場合に限り有効です。

4. 管理者に確認すべき設定と制限

会社の環境では、Power Automateのテナントレベルで制限が設定されている場合があります。例えば、フローの実行時間は最大30日(Standardプラン)ですが、実際には1回の実行が1時間を超えるとタイムアウトすることもあります。また、1分あたりのAPI呼び出し数(レート制限)が設定されており、ループ内で多数の呼び出しを行うと制限に抵触してエラーになります。

これらは一般ユーザーでは変更できないため、管理者に以下の点を確認してください。

  • Power Automateのライセンス(Standard、Premium)により、利用できるコネクタやアクションの種類が異なります。バッチ処理用のアクションはPremiumライセンスが必要な場合があります。
  • データ損失防止(DLP)ポリシーにより、特定のコネクタの組み合わせが禁止されている可能性があります。ループ内で使用するコネクタがDLPに抵触していないか確認してください。
  • カスタムコネクタやオンプレミスデータゲートウェイが必要な場合、管理者のセットアップが必要です。ループが遅い原因がゲートウェイ経由の遅延ならば、設定の見直しを依頼します。

5. よくある質問(FAQ)

Q1: ループの反復回数が1万件を超える場合、何か良い方法はありますか?

A: 1万件を超える大量データの処理では、まずフィルターで処理対象を絞れるかを検討します。どうしても全件処理が必要なら、バッチ分割と並列実行を組み合わせます。例えば、1000件ずつのバッチに分けて複数のフローインスタンスを並列で動かす方法があります。また、SharePointやSQL Serverには一括更新用のアクション(「複数の行を更新」など)があるので、それを利用するとループが不要になる場合があります。

Q2: ループ内で「アイテムの作成」を連続して行うと、時間がかかります。並列実行は使えますか?

A: はい、Apply to eachの設定で「同時実行制御」を有効にすることで、複数のアイテム作成を並列に実行できます。ただし、同時に作成できる数には制限があるため、Degree of Parallelismは10以下に設定するのが安全です。また、対象のSharePointリストに大きな負荷がかかる可能性があるため、事前にテストしてください。

Q3: ループが遅くなる原因がわからない場合はどうすればいいですか?

A: まず実行履歴を詳細に確認し、各アクションの時間を記録します。特にループアクションの「出力」タブで、各反復の開始時間と終了時間を確認できます。また、フローを部分的にコピーして簡略化したテストフローを作り、原因を絞り込みます。それでもわからなければ、Microsoftのサポートコミュニティや管理者に問い合わせてください。

まとめ

Power Automateでループが遅い原因は、反復回数の多さ、ループ内アクションの遅延、構造的な非効率、そしてAPI制限など多岐にわたります。最初に実行履歴でボトルネックを特定し、フィルターや並列実行、バッチ処理などの改善策を適用することで、実行時間を大幅に短縮できます。また、可能であればループを使わない一括処理のアクションに置き換えることも効果的です。会社の環境では管理者の協力が必要な設定もあるため、相談しながら進めてください。本記事の手順を参考に、効率的なフローを構築していきましょう。


ADVERTISEMENT

この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。

ADVERTISEMENT