🏅

Salesforce開発者が選ぶ!よくあるガバナ制限ランキングと対処法まとめ

に公開

はじめに:Salesforceのガバナ制限とは?

ガバナ制限とは、Salesforceが定めている処理ごとの上限ルールのこと。これを超えるとエラーになって処理が止まってしまいます。
そのため、Salesforce開発では、常にこの制限を意識した設計・実装が求められます。
この記事では、Salesforce開発者としての自身の経験をもとに、よく考慮に挙がるガバナ制限をランキング形式できればと思います!

ガバナ制限ランキング TOP5

🥇 第1位:発行できるDMLの合計数

出現度:★★★★★|難易度:★★★☆☆

📝 制限概要

トランザクション内で実行できるDML操作の上限回数の制限で、現在は150回です(昔は100回でした)。
Apexトリガーやバッチ、InvocableMethodなどでは複数レコードをまとめて処理するのが前提のため、この制限は常に意識しておく必要があります。
特に初心者が最初にぶつかりやすいポイントです!

✅ 対処方法

Mapやカスタムクラスのリストを使って処理対象レコードをまとめて、一括でDML実行することで対処できます!
forループ内でDML実行することは絶対に避けましょう!


🥈 第2位:発行できるSOQLクエリの合計数

出現度:★★★★★|難易度:★★☆☆☆

📝 制限概要

こちらは、Apexトランザクション内で実行できるSOQLの回数が最大100回までという制限です。
DML制限と似ていますが、データ取得に関するもので比較的対処しやすく、知っていればあまり引っかかることはありません。

✅ 対処方法

ListSetバインド変数として使い、1回のSOQLで複数レコードを一括で取得することで対処できます!
ただ、複数条件に該当するレコードを一括で取得しているため、取得後のデータ処理(たとえばMapにまとめて整形するなど)は、それなりにロジックを考慮する必要があります。


🥉 第3位:SOQLで取得できるレコード数の上限

出現度:★★☆☆☆|難易度:★★★★☆

📝 制限概要

1つのトランザクション内で、SOQLによって取得できるレコード数は最大5万件という制限です。
ある程度データ量がある組織でないと普段は意識しませんが、大量データ処理が必要になると途端に厄介となる制限です。

✅ 対処方法

考慮しなければならない箇所によって対応は変わりますが、バッチ処理の場合は バッチサイズを小さくすることで回避できます。
同期処理(例:トリガーなど)でこの制限に引っかかる場合は、Queueableなどを用いて処理を分割することで対処できます。
また、そう対応した場合は、非同期Apexの1日あたりの実行上限にも注意が必要になります。


🏅 第4位:APIコールアウトのタイムアウト累積値

出現度:★★☆☆☆|難易度:★★★☆☆

📝 制限概要

Salesforceから外部サービスに API コールを行うとき、待ち時間の合計が120秒を超えるとエラーになります。
1回のコールで超えることは稀ですが、トランザクション内で複数回コールアウトがある場合は注意が必要です。

✅ 対処方法

バッチサイズを調整して、1回のトランザクション内でのAPIコール回数を減らすことで対処できます。
また、外部API側が「ページング」や「分割取得」を前提として設計されている場合は、それに合わせた設計を行うことで回避することもできます。


🏅 第5位:SOQL クエリの最大実行時間

出現度:★★☆☆☆|難易度:★☆☆☆☆

📝 制限概要

SOQLの実行時間が120秒を超えるとエラーになります。
大量データを扱っているオブジェクトへのアクセスする際には、この制限を考慮する必要があります。

✅ 対処方法

最も基本的な対策は、クエリ条件に指定する項目にインデックスを付けること。
Salesforceでは、いくつかの項目(例:Id、CreatedDateなど)には標準でインデックスが付いています。
大量データを扱うなら、常にインデックスを意識した設計を心がけましょう!


🎖️ 番外.外部オブジェクトからSOQLで取得できる最大数

出現度:★☆☆☆☆|難易度:★★★★★

📝 制限概要

Salesforceで外部オブジェクトにSOQLを実行する場合、1回のクエリで取得できるのは最大2000件までという制限です。
この上限を超えるとToo many records retrieved for external objectエラーが発生します。

✅ 対処方法

外部オブジェクトへのクエリ結果が2000件以内で収まるように、フィルター条件を工夫する必要があります。
例えば、バッチ処理で使う場合は、対象データに「処理済みフラグ」などを持たせ、1回の取得件数を制御できるような設計する方法があります。
外部オブジェクトのデータを取得して処理する時は、取得件数は常に2000件までに抑えることを意識しましょう!

さいごに

いかがでしたでしょうか?
今回は、実際にSalesforce開発をしていてよく遭遇するガバナ制限をランキング形式でご紹介しました。
Salesforceにはまだまだ他にも制限があり、思わぬところで引っかかることもありますが、事前に知っておくことで防げるものばかりです。
制限とうまく付き合うためには、

  • 「知っておくこと」
  • 「忘れないこと」

この2つがとても大切だと感じています。
これからSalesforce開発を始める方にとって、少しでも参考になれば嬉しいです!😄

株式会社アクトビ

Discussion