Salesforce開発において、ガバナ制限を理解しておくことは、フローであれApexであれ重要です。本記事では、ガバナ制限が具体的にどのような影響を持つのか、そして回避策やベストプラクティスを詳しく解説していきます。
これから紹介する内容を参考に、システムの安定性を維持しながら、効率的な開発を進めていきましょう。
Salesforceのガバナ制限とは?
ガバナ制限は、Salesforceにおけるリソース使用を制限する仕組みです。
なぜなら、Salesforceはクラウドサービスであり、サーバーなどのリソースを複数の組織が共有しているためです。
もし無制限にリソースを使用できると、リソース分配の不公平や処理速度の低下が生じる可能性があります。
そこで、ガバナ制限を設けることで、すべての組織が公平にリソースを分配できるようにし、システム全体の安定性とパフォーマンスを維持しています。
ガバナ制限が適用されるケース
ガバナ制限とは、Salesforceがクラウド環境で安定したサービスを提供するために設けた一連の制約です。
これには、DML(データ操作言語)操作やSOQL(Salesforce Object Query Language)クエリの回数、CPU使用時間、APIコール数など、さまざまなリソースの利用に対する上限が含まれます。
ガバナ制限の対象一覧表
下表はSalesforce公式のAPEXリファレンス内のガバナ制限の記載ページの情報を基に整理しました。
一次情報はこちらです。たまに更新されることがありますのでご注意ください。
カテゴリ | ガバナ制限の種類 | 制限内容の例 |
---|---|---|
クエリ関連の制限 | SOQLクエリ制限 | 1トランザクションあたり最大100件のSOQLクエリ実行(非同期:200件) |
SOQLクエリの行数制限 | 1つのSOQLクエリで返せるレコード数は最大50,000件 | |
データベースクエリの結合制限 | 1つのSOQLクエリ内で結合できるオブジェクト数は最大10個 | |
データ操作関連の制限 | DML操作制限 | 1トランザクションあたり最大150回のDML操作(非同期:200回) |
パフォーマンス関連の制限 | CPU時間制限 | 1トランザクションあたり最大10秒のCPU使用時間(非同期:60秒) |
メモリ使用制限 | 1トランザクションあたり最大6MBのメモリ使用(非同期:12MB) | |
API関連の制限 | APIコール制限 | 組織全体で1日あたり実行できるAPIリクエスト数の制限(契約プランに依存) |
トランザクションごとのAPIコール制限 | 1トランザクション内で最大100回のAPIコール | |
外部システム連携の制限 | コールアウト制限 | 1トランザクションあたり最大10回のHTTPコールアウト |
メール関連の制限 | メール送信制限 | 1日あたりのメール送信件数に制限(通常は5,000件まで) |
バッチ処理関連の制限 | バッチサイズ制限 | 1バッチあたりのレコード数は最大200件(非同期:2,000件) |
同時実行リクエスト関連の制限 | 同時実行リクエスト制限 | 1組織が同時に実行できるリクエスト数に制限 |
レコードロック関連の制限 | レコードのロック制限 | 1トランザクションあたり最大10,000件のレコードロック |
Apex制限 | ガバナ制限ごとの制限チェック | 1トランザクションあたりガバナ制限をチェックする最大数(例:SOQL、DML) |
フローでガバナ制限に抵触するケースの例
Salesforceのフローは、プログラミングを省いてノーコードでビジネスプロセスを自動化できるので、大変便利です。一方で、ガバナ制限は前述の表同様、フローにも適用されますので注意が必要です。
Apexを使ったプログラミングをしているわけではないとはいえ、フローも裏側ではApex同様、DML操作やSOQL発行を行っているからです。
以下では、フローでガバナ制限に抵触する代表的なユースケースを紹介します。
大量データのDML操作
フローで多数のレコードをインサート、アップデート、デリートする場合、1トランザクションあたりのDML操作数が150回(非同期で200回)を超えると、ガバナ制限に抵触する可能性があります。例えば、複数のレコードを一括更新するようなフローを設計する際には、バッチ処理を検討する必要があります。
複数のSOQLクエリ実行
フロー内で複数のSOQLクエリを実行する場合、1トランザクションあたりのSOQLクエリ実行回数が100回(非同期で200回)を超えると、制限に抵触します。たとえば、条件分岐を含むフローで多数のクエリを実行すると、クエリ数が増加しやすいため注意が必要です。
大量のレコードを返すSOQLクエリ
フローで実行するSOQLクエリが大量のレコードを返す場合、1クエリあたりの行数制限(最大50,000行)に達することがあります。特に、条件のないクエリや全件検索するクエリを使用する場合、制限に抵触しやすくなります。
複雑なデータ操作やクエリの使用
複数のオブジェクトを結合するSOQLクエリや、複雑な条件でのフィルタリングを行うフローでは、CPU時間制限(同期で10秒、非同期で60秒)に達する可能性があります。これにより、処理が途中で中断されるリスクがあります。
大量のトリガーやプロセスの呼び出し
フローの実行中に多数のトリガーや他のプロセスを呼び出すと、コールアウト制限(1トランザクションあたり最大10回)に達する可能性があります。これにより、フローが想定通りに動作しないリスクがあります。
これらのユースケースでは、フローの設計段階からガバナ制限を考慮することが重要です。処理をバッチ処理に分割する、条件を絞り込む、DML操作やSOQLクエリの回数を最小限に抑えるなどの対策が、フローでのガバナ制限抵触を防ぐために有効です。
ガバナ制限を回避するためには
Salesforceのガバナ制限を回避するためには、開発時に制限を十分に考慮した設計と実装が不可欠です。ここでは、ガバナ制限を回避するためのベストプラクティスと、フローやAPIを使用する際の具体的な回避方法を紹介します。
ガバナ制限回避のベストプラクティス
ガバナ制限回避のベストプラクティスを3カテゴリに分けて紹介します。
1. Apexでのガバナ制限回避策
バルク処理の活用とクエリの最適化
Apexコードでガバナ制限を回避するためには、バルク処理を積極的に取り入れることが重要です。バルク処理は、複数のレコードを一度に処理することで、DML操作やSOQLクエリの実行回数を最小限に抑え、ガバナ制限に引っかかるリスクを減らします。たとえば、50件や100件のレコードをリストでまとめてinsert
やupdate
することで、個別の操作を回避し、効率的な処理が可能になります。
SOQLクエリの最適化も重要です。必要な項目のみをクエリし、WHERE句で条件を適切に設定して結果を絞り込むことで、クエリの実行回数を抑えることができます。これにより、ガバナ制限に達するリスクを低減できます。
Limitsクラスを利用したガバナ制限の管理
Limits
クラスを活用することで、Apexコード内でガバナ制限の状況をリアルタイムに確認できます。たとえば、Limits.getQueries()
メソッドで現在のSOQLクエリ数を確認し、Limits.getLimitQueries()
で許容される最大クエリ数を把握できます。これにより、ガバナ制限に近づいた際に適切な対応が取れ、エラー発生を未然に防ぐことができます。ログを出力して使用状況を記録することで、さらなる最適化も可能です。
2. APIを使用する際のガバナ制限回避策
APIコールの効率的な使用方法と最小化
Salesforceでは、APIの使用に関して1日あたりのリクエスト数やトランザクションごとのAPIコール数に厳しい制限が設けられています。これらの制限に抵触しないよう、効率的なAPIコールの使用とリクエスト数の最小化が求められます。
効率的なAPIリクエストの最適化
APIを利用する際、無駄なリクエストを避けるためには、まず必要なデータだけを取得することが重要です。REST APIやSOAP APIでのリクエストを最適化するには、以下の方法が有効です。
- フィルタリングと選択的なデータ取得: クエリやリクエストパラメータを活用し、必要なフィールドやレコードのみを取得するように設計します。例えば、SOQLクエリの際にWHERE句を活用して、特定の条件を満たすデータのみを取得することで、APIコールの回数を減らし、効率的なデータ取得を実現します。
- バッチ処理: バッチ処理を用いてAPIリクエストをまとめて行うことで、リクエスト数を大幅に削減できます。たとえば、
Composite API
を使用すると、複数のリクエストを1つのAPIコールにまとめることができ、1回のリクエストで複数の操作を行うことが可能になります。
APIリクエストの最小化
リクエスト数をさらに最小限に抑えるための手法として、以下のアプローチが効果的です。
- データのキャッシュ: 同じデータを繰り返し取得する必要がある場合、データをキャッシュに保存し、キャッシュからデータを取得することで、APIリクエストの回数を減らすことができます。これにより、同じデータに対するAPIコールを最小限に抑え、ガバナ制限の余裕を確保できます。
- リクエストの遅延実行: 一度に大量のAPIコールを行わないよう、リクエストの遅延実行を取り入れることが有効です。これは、短期間に多くのリクエストを行うのではなく、時間を分散させて実行することで、APIリクエストの総数が制限を超えないように調整する方法です。
- 非同期処理の活用: 大量のデータを処理する必要がある場合、APIコールを非同期で行うことで、リアルタイムでの負荷を軽減し、トランザクションごとのAPIコール数を管理できます。非同期処理を導入することで、ユーザーへの応答性を保ちながら、リクエストがスムーズに処理されるように設計することができます。
3. フローでのガバナ制限回避策
フロー設計時の注意点とトランザクションの管理
フローを設計する際には、ガバナ制限を考慮した構造を意識することが不可欠です。特に、複雑な条件分岐や大量のデータ操作を伴うフローでは、トランザクションが肥大化しやすく、ガバナ制限に抵触するリスクが高まります。このため、各ステップの処理を可能な限りシンプルにし、データ操作を最小限に抑える設計が求められます。
シンプルな設計とデータ操作の最小化
フロー内でのSOQLクエリやDML操作を最小限に管理することは重要です。特に、ループ内でDML操作を行わないようにすることが推奨されます。ループ内でのDML操作は、ガバナ制限に容易に達する原因となるため、ループ外でバルク処理として一括で処理することで、トランザクション全体の負荷を軽減できます。
非同期処理の活用
フローの実行回数やトランザクションの負荷を分散させるために、非同期処理を活用することも効果的です。非同期フローを使用することで、処理が別のセッションで実行され、トランザクション内の負荷が軽減されます。これにより、1つのフローにかかるガバナ制限の影響を分散し、リスクを減らすことが可能になります。
トランザクション管理の具体的な工夫
フローでガバナ制限に抵触しないようにするためには、まずは取得するレコード数を最小限に抑え、必要なデータのみを対象とすることが基本です。これに加え、DML操作をループ外に移すことで、ガバナ制限に引っかかるリスクを減らし、フローの安定性を確保することができます。
これらの対策を適切に講じることで、フローがガバナ制限に達するリスクを軽減し、Salesforceでの効率的なビジネスプロセス自動化を実現できます。
まとめ
Salesforceでのガバナ制限を回避するためには、Apex、API、フローそれぞれでの最適化が不可欠です。バルク処理、非同期処理、リクエストの効率化などを活用し、システム全体のパフォーマンスを維持しましょう。