Salesforceのガバナ制限とは?開発で事前に知っておきたい点を網羅

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件のレコードをリストでまとめてinsertupdateすることで、個別の操作を回避し、効率的な処理が可能になります。

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、フローそれぞれでの最適化が不可欠です。バルク処理、非同期処理、リクエストの効率化などを活用し、システム全体のパフォーマンスを維持しましょう。