[Salesforce開発] Apex: ガバナ制限とは?

SFエンジニア

Apexでプログラムを作ってテストしていたら “System.LimitException”というエラーが出たんだけど、なんでかね?

SF宣教師

ガバナ制限を超えたときにスローされるエラーですね。説明します。

目次

Apex: ガバナ制限とは?

Salesforceはクラウドベースのプラットフォームであり、多数の顧客が同じリソースを共有して使用しています。一つの組織やユーザーが過度にリソースを消費し、他の顧客のパフォーマンスに影響を与えるのを防ぐために、さまざまな ガバナ制限 を導入しています。

ガバナ制限
Salesforceのクラウドプラットフォーム上で各組織やユーザーがリソースを過度に消費しないように設定された一連の制約や上限のことを指します。これにより、多数の顧客が共有するリソースを均等に使用でき、システムのパフォーマンスと安定性が保たれます。ガバナ制限を超えるとエラーが発生し、関連する操作は失敗します。

以下は、Salesforceの主要なガバナ制限の一部です:

  • SOQLクエリ制限: 1つのトランザクション内で実行できるSOQLクエリの数に制限があります。
    制限(同期 Apex の場合) – 100
    エラーメッセージの例 – System.LimitException: Too many SOQL queries: 101
    1つのトランザクション内で許可されたSOQLクエリの数を超えたときに表示されます。
  • SOQLレコード取得制限: 1つのSOQLクエリで取得できるレコード数に制限があります。
    制限 – 50,000
    エラーメッセージ: System.LimitException: Too many query rows: 50001
    1つのSOQLクエリで取得できる最大レコード数を超えた場合に表示されます。
  • DMLステートメント制限: 1つのトランザクション内で実行できるDMLステートメント(insert, update, delete, upsertなど)の数や、1つのDMLステートメントで処理できるレコード数に制限があります。
    制限 – 150
    エラーメッセージの例: System.LimitException: Too many DML statements: 151
    1つのトランザクション内で許可されたDMLステートメントの数を超えたときに表示されます。
  • Apex CPU時間制限: 1つのトランザクションにおけるApexコードの最大実行時間には制限があります。これは、長時間実行されるコードがシステム全体のパフォーマンスに影響を与えないようにするためです。
    制限(同期 Apex の場合) – 10,000 ミリ秒
    エラーメッセージ: System.LimitException: Apex CPU time limit exceeded
    1つのトランザクションにおけるApexのCPU使用時間が許可された限度を超えたときに表示されます。

他にも多くのガバナ制限があります。
Salesforce Developer の制限および割り当てクイックリファレンス: Apex ガバナ制限

Apex ではガバナ制限を超えないようにするための、プログラミングの定石があります。例えば以下のようなものです。

  • ループ内でのSOQLやDMLステートメントの使用を避け、代わりにリストやセットを使用してデータを集約し、一度に処理する。
  • SOQLクエリでは、必要なフィールドのみを取得するようにクエリを書く。また、WHERE句を使用して必要なレコードのみをフィルタリングする。
  • 制限を緩和するために、バッチApexなどの非同期処理を利用する。
SF宣教師

Apex でガバナ制限を超えないようにするためのベストプラクティスについては、別のトピックでサンプルコードを示しながら説明する予定です。

以上です!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次