Apex

開発者コンソールでApexの実行を確かめガバナ制限を読む方法

コードを実行してログを開き、1トランザクションのガバナ制限と非同期処理の選び方まで順に説明します。

2023.02.20

Apexの実行は1トランザクション単位

Apexのコードは、開発者コンソールから直接実行しても、トリガから呼ばれても、1回の実行が1つのトランザクションです。トランザクションの中でSOQLを何回発行したか、DMLで何行変更したか、CPU時間をどれだけ使ったかは、すべて共通の上限(ガバナ制限)で管理されています。上限を超えると、その場で例外が発生して処理全体が止まります。

処理を作り込む前に、いま書いているコードがどの上限をどれだけ消費しているかを確かめられるようにしておきます。

開発者コンソールで実行して確かめる

  1. Execute Anonymous Windowを開く

    開発者コンソールのメニューから「Debug」→「Open Execute Anonymous Window」の順に選びます。

  2. コードを貼り付ける

    「Enter Apex Code」に確認したいコードを貼り付けます。匿名コードの中ではstaticキーワードは使えません。

  3. Open Logにチェックを入れて実行する

    「Open Log」を有効にしてから「Execute」(またはCtrl+E)を押します。実行が終わると、結果のデバッグログがログインスペクターで自動的に開きます。

  4. 同じコードを再実行する

    コードを直さずもう一度流すだけなら、メニューの「Debug」→「Execute Last」で再実行できます。

サンプルとして、取引先を読み取るだけの単純なコードを使います。

for (Account acc : [SELECT Id, Name FROM Account]) {
    System.debug('accountName : ' + acc.Name);
}

SOQLは1回だけです。ループの中ではDMLもSOQLも発行していません。安全な書き方です。

ログでガバナ制限の消費を見る

開いたログインスペクターには、実行内容を時系列で追える表示と、メソッド・クエリ・DMLなど処理の単位ごとに集計した表示があります。どちらも、どこで時間や呼び出し回数を使っているかを後から追うための機能です。

デバッグログのイベント種別(SOQL_EXECUTE_BEGIN・DML_BEGIN・LIMIT_USAGE_FOR_NSなど)を見れば、どの行がSOQLやDMLを発行し、そのときガバナ制限をどれだけ使ったかを正確に追えます。

1トランザクションのガバナ制限

Apexコードは、この上限の中で動きます。同期実行(画面操作やAPI呼び出しから直接動くApex)と、非同期実行(後述のBatch・Queueable・@future)とで、上限が違う項目があります。

項目同期実行非同期実行
SOQL発行回数100回200回
DML発行回数150回150回
DMLで処理できるレコード数10,000行10,000行
SOQLで返せるレコード数50,000行50,000行
CPU時間10,000ミリ秒60,000ミリ秒
ヒープサイズ6MB12MB

⚠️ DML発行回数・DML対象行・SOQLで返せる行数は、同期でも非同期でも同じです。増えるのはSOQL発行回数とCPU時間、ヒープサイズだけです。非同期にすれば上限が全部緩くなるわけではありません。

同期と非同期で何が変わるか

同期実行は、呼び出し元が結果を待ちます。画面のボタンやトリガはこちらです。非同期実行は、呼び出し元を待たせずに、システムのリソースが空いたタイミングで別トランザクションとして動きます。上の表のとおり、非同期はCPU時間とヒープサイズの余裕が大きく、SOQL発行回数も増えます。時間のかかる処理や、大量のレコードを扱う処理を、同期側から追い出すのが非同期を使う一番の理由です。

非同期の選び方

方法向いている場面制約
@future外部サービスへのコールアウトや、別オブジェクトのDMLを本体のトランザクションから切り離したいとき引数はプリミティブ型(またはその配列)だけです。呼び出し順は保証されません。@futureから@futureは呼べません
Queueable実行状況をAsyncApexJobで追いたいとき、sObjectなどプリミティブでない型を引数として持たせたいときSystem.enqueueJobで次のジョブを連結できます(チェーン)
Database.Batchable大量のレコードをstart・execute・finishに分けて処理したいときexecuteは既定200件(QueryLocator使用時は最大2,000件)ずつ呼ばれ、呼ばれるたびにガバナ制限がリセットされます

ここで間違えやすい

間違い何が起きるか
非同期にすればDMLの行数上限も緩くなると思い込むDML発行回数・対象行数・SOQLで返せる行数は同期と同じです。増えるのはSOQL発行回数とCPU時間・ヒープだけです
@futureメソッドの引数にsObjectを渡そうとするプリミティブ型以外は渡せません。IDを渡してメソッドの中で取得し直します
@futureから@futureを呼ぶ許されていません。呼び出した時点でエラーになります
Execute Anonymous Windowの中でstaticを使う匿名コードでは使えません

確認した環境

  • 2026年9月/Salesforce Summer '26(APIバージョン67.0)時点の公式ドキュメントで、ガバナ制限の実数と@future・Queueable・Batch Apexの違いを確認しています
  • Execute Anonymous Windowの操作手順はSalesforceヘルプの記載どおりです

まとめ

  • Apexの実行は1トランザクション単位で、SOQL発行回数・DML発行回数・CPU時間・ヒープサイズなどのガバナ制限を共有します
  • 同期実行はSOQL100回・DML150回・DML対象10,000行・SOQL取得50,000行・CPU10,000ミリ秒・ヒープ6MBです
  • 非同期実行で緩くなるのはSOQL発行回数(200回)とCPU時間(60,000ミリ秒)・ヒープ(12MB)だけです。DMLまわりの上限は同期と同じです
  • 外部コールアウトの切り離しは@future、ジョブの監視や非プリミティブ引数が要るならQueueable、大量データの分割処理はBatch Apexを選びます
  • Execute Anonymous Windowではstaticが使えません。実行結果はOpen Logを有効にしてログインスペクターで確認します

Salesforceの導入・運用についてご相談ください

導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。