実行時ガバナおよび制限の理解

Apexはマルチテナント環境で実行されるため、Apexランタイムエンジンは共有リソースを独占しないように、いくつかの制限を厳しく実施します。 これらの制限またはガバナは、以下の表であらわされる数値に基づいてトラッキングされ、実施されます。 Apexコードが制限を超えた場合は、関連するガバナはハンドリング不可の実行時例外を出します。

ガバナ制限は、全組織、ならびに特定のnamespaceに適用されます。 たとえば、Salesforce.com ISV パートナーによって作成された管理パッケージをForce.com AppExchangeからインストールした場合、パッケージに含まれるコンポーネントは組織中の他のコンポーネントから独立したnamespaceに属しています。したがって、そのパッケージ中のApexコードは150回までDML文を実行できます。さらに、組織中に既に存在するApexコードも最大で150回のDML文を実行できます。それは、管理パッケージと既存の組織中コードの両方が実行された場合は、1回のリクエストで150回以上のDML文が実行されるかもしれないということを意味します。 一方で、Salesforce.com ISVパートナーによって作成されていないAppExchangeからパッケージをインストールした場合は、そのパッケージに含まれるコードは別のガバナ制限としてカウントされません。 累積的なリソースメッセージおよび警告電子メールも管理パッケージnamespaceに基づいて生成されます。 Salesforce.com ISVパートナーパッケージの詳細については、salesforce.com パートナープログラムを参照してください。

説明 制限
1回のトランザクションで実行できるSOQLクエリの合計回数1 100
Batch Apex およびfutureメソッドにおいて1回のトランザクションで実行できるSOQLクエリの合計回数1 200
1回のトランザクションでSOQLクエリにより取得できる合計レコード数 50,000
1回のトランザクションで実行できるSOSLクエリの合計回数 20
1回のトランザクションでSOSLクエリにより取得できる合計レコード数 200
1回のトランザクションで実行できるDML文の合計回数2 150
1回のトランザクションでDML文、またはApproval.process、またはdatabase.emptyRecycleBinにより処理できる合計レコード数 10,000
1回のトランザクションで実行可能なステートメント数 200,000
Batch Apex およびfutureメソッドにおいて1回のトランザクションで実行可能なステートメント数 1,000,000
1回のトランザクションで消費できるメモリヒープサイズ3 3 MB
Batch Apex およびfutureメソッドにおいて1回のトランザクションで消費できるメモリヒープサイズ 6 MB3
ApexからのDML文(insert, update, delete)呼び出しで再帰的に起動されるトリガの呼び出し階層の深さ4 16
ForループListのバッチサイズ 200
1回のリクエストで呼び出せるコールアウト処理の回数 (HTTPリクエスト または Web services コール) 10
1回のリクエスト中のすべてのコールアウト処理のタイムアウト (HTTPリクエスト または Web services コール) 120 秒
1回のリクエスト中のコールアウト処理のデフォルトタイムアウト (HTTPリクエスト または Web services コール) 10 秒
1回のApex起動で実行できる@futureアノテーションがついたメソッド数5 10
コールアウトリクエストまたはレスポンスの最大サイズ (HTTPリクエスト または Web services コール) 6 3 MB
1回のトランザクションで実行できるsendEmailメソッドの回数 10
1回のトランザクションで実行できるdescribeメソッドの回数7 100

1 親-子リレーションシップサブクエリのあるSOQL文では、各親-子リレーションシップは追加のクエリとしてカウントされます。このような形のクエリは制限値がトップレベルクエリの3倍となります。リレーションシップクエリ結果の行数はスクリプト実行全体の行数に含めてカウントされます。

2次のメソッドはリクエスト中のDML文の実行としてカウントされます。:

3 Batch Apex のメモリヒープサイズは 6 MB です。電子メールサービスのメモリヒープサイズは 18 MB です。

4 insert, update, または delete文によるトリガの実行を伴わない、再帰的なApex呼び出しは同一の処理レイヤとして扱われます。 一方、トリガにより起動された再帰的なApex呼び出しは、トリガを起動した呼び出しとは別の呼び出しとして扱われます。 なぜならば、新しいApex呼び出しはコストの高い処理であるため、このタイプの深い階層の呼び出しにはより厳しい制約が課せられるためです。

5Salesforceは、futureアノテーションに対する制限を課しています。24時間に、フルSalesforceユーザーライセンス数, Salesforce Platformユーザーライセンス数, および Force.com - One Appユーザーライセンス数毎に200回のメソッド呼び出しが可能です。これは組織単位での制限です。Chatter Only, ゲストユーザー, カスタマーポータルユーザー, およびパートナーポータルユーザーライセンスはこの制限の計算に含まれません。たとえば、ある組織が3つのフルSalesforceユーザーライセンスと2つのSalesforce Platformライセンスと、100のカスタマポータルユーザーライセンスを持っているとしましょう。組織全体では24時間に1,000回のメソッド呼び出しが可能です。( (3 + 2) * 200です。105ではありません。)

6HTTPリクエストおよびレスポンスのサイズは合計メモリヒープサイズの一部として計算されます。 この制限に関係なく、3MBの合計メモリヒープサイズを超えないようにしてください。

7 Describes は、次のメソッドおよびオブジェクトを含みます。:

制限は、各 testMethodに対して独立して適用されます。

実行中のコードのスクリプト実行制限を判断するために、Limitsメソッドを使用してください。 たとえば、プログラムによって既にコールされたDML文の数を判断するためのgetDMLStatementsメソッドや、またはそのコンテキストでのDML文実行可能な回数を判断するための getLimitDMLStatementsメソッドを使用できます。

より効率的なSOQLクエリのために、特にトリガ中でのクエリでは、より絞り込み効果の高い、インデックスを利用したクエリを使用しください。絞り込み効果の高いクエリとは、プライマリキー(Id)、外部キー、Name項目、監査日付(例: LastModifiedDate)、外部ID項目でフィルタリングするクエリです。 大きな組織では、実行時間が非常に長くなるのを防止するために性能の低いクエリは停止させることができます。停止させたい場合は、Salesforce.comの担当者に連絡してください。
注意
トリガ中で10万件以上のレコードを含んだオブジェクト中で絞り込み効果の低いクエリを利用した場合は、エラーが発生します。回避するには、WHERE句にインデックス化された項目を含めるようにしてください。

static変数の値はAPIバッチごとにリセットされますが、ガバナ制限はリセットされません。APIバッチの状態のトラッキングにstatic変数を使わないでください。なぜならば、Salesforceはユーザーが指定したバッチサイズよりもより細かい単位にバッチを分割している可能性があるためです。

実行時のガバナ制限に加え、Apexには次の制限があります:

電子メールの制限

インバウンド電子メールの制限
電子メールサービス: 処理可能な電子メールメッセージの最大数

(オンデマンド電子メール-to-caseを含む)

ライセンス数に1,000を乗じた数
電子メールサービス: 電子メールメッセージの最大サイズ (ボディおよび添付) 10 MB1
オンデマンド電子メール-to-ケース: 添付ファイルの最大サイズ 10 MB
オンデマンド電子メール-to-ケース: 処理可能な電子メールメッセージの最大数

(電子メールサービスの制限と合算されます)

Number of user licenses multiplied by 1,000
1 電子メールサービスにおけるメッセージの最大サイズは言語と文字コードセットに依存します.
電子メールサービスを作成する際は次の点に注意してください:
  • 電子メールサービスは受信したメール中の1つのアドレスのみ処理します。
  • Salesforceは、オンデマンド電子メール-to-ケースを含む、統合された電子メールサービスの処理可能な数を日次で制限します。制限を超えたメッセージはバウンスされ、破棄されるか次の日に実行されるキューに入れられます。この動作は、各電子メールサービスの「メールの処理数制限超過時のアクション」設定により選択可能です。 Salesforce はユーザライセンス数に1,000を乗じた数で制限値を求めます。たとえば、もし10ライセンスをお持ちであれば組織は最大10,000/日の電子メールメッセージを処理できます。
  • Sandbox組織で作成した電子メールサービスアドレスは、本番組織へコピーできません。
  • 各電子メールサービスのエラーメールを、送信者のアドレスの代わりの特定のアドレスへ送信するようにSalesforceを設定できます。
  • 電子メール(テキスト本文、HTML本文および添付ファイルを含む)が約10MB(言語や文字セットにより異なります)を超えた場合、電子メールサービスは送信者に通知し、電子メールを拒否します。
アウトバウンド電子メール: Apexから送信されるシングルおよび一括メール送信

シングルメールを最大1,000通/日(GMTベース)まで外部へ送信できます。 標準アプリケーションから送信されるシングルメールはこの制限のカウントに含められません。

一括送信メールを最大1,000通/日(GMTベース)まで外部へ送信できます。 各メールに含めることができる外部アドレスの最大数はご利用のSalesforce エディションに依存します。:
エディション 一括送信メールのアドレス数制限
Professional 250
Enterprise Edition 500
Unlimited Edition 1,000
注意
一括送信メールの制限はユニークなアカウントを考慮しません。たとえば、johndoe@example.com が1つの一括送信メール中に10個あった場合は、10としてカウントされます。
組織内のユーザーに対しては無制限にメールを送信できます。

Batch Apex のガバナ制限

Batch Apexを利用する際は下記に留意してください。:
  • バッチジョブは最大5つまでキューまたはアクティブになることができます。
  • ユーザーごとに同時に最大5つのクエリカーソルをオープンできます。たとえば、既に5つのカーソルをオープンした状態で同一ユーザーが新しいカーソルをオープンすると、古いほうのカーソルから解放されます。

    カーソルの制限は異なるForce.comの機能間では独立して管理されます。たとえば、ユーザーは5つのApexカーソル、5つのバッチカーソル、さらに5つのVisualforceカーソルを同時にオープンすることができます。

  • Database.QueryLocatorオブジェクトは、最大で5千万件のレコードを返せます。もし5千万件を超えるレコードが返された場合は、バッチジョブはただちに終了され、失敗となります。
  • オプションのscope引数が指定されない場合は、SalesforceはQueryLocatorからレコードを200件ずつのかたまりで返し、executeメソッドに渡します。Apexガバナ制限はexecuteメソッドの実行毎にリセットされます。
  • startメソッド、executeメソッド、およびfinishメソッドには、それぞれ1つずつコールアウトを実装できます。
  • バッチ実行につき、1回だけコールアウトを実行できます。
  • 24時間に最大250,000回のバッチを実行できます。
  • Batch Apexのstartメソッドは、組織中で同時に1つのみ実行されます
See Also:
What are the Limitations of Apex?
© Copyright 2000-2011 salesforce.com, inc. All rights reserved.
Various trademarks held by their respective owners.