見出し画像

【Salesforce】Apexガバナ制限回避方法_5万件以上のレコードを扱う方法

はじめに

こんにちは、CREFILの濱本です。
今回は Apex ガバナ制限 のエラー回避方法についてお話します。
様々なガバナ制限がありますが、今回は、5万件以上のレコードをSOQLで取得して処理に使いたい場合の回避方法を説明していきます。

対象のガバナ制限は「SOQL クエリによって取得されるレコードの合計数 50,000件」です。
ちなみに5万件以上のデータを扱うとエラーメッセージ「Too many query rows: 50001」が表示されます。

なぜガバナ制限が設けられているのか

なぜ、ガバナ制限が設けられているのかというと、Salesforceの複数の利用者がリソースを共有している「マルチテナント環境」で動いているため、リソースを極端に占有するような処理を実行させないために、ガバナ制限が設定されています。要するに、他の利用者に迷惑がかかってしまうということです。

これは自分を守るためにもですが、基本的にはガバナ制限で設定されている数値を上限に、要件定義および設計をしていきましょう。5万件以上のデータを扱うような環境の場合、Salesforceの他にDB機能を持つプラットフォームを組み合わせることをおすすめします。

ですが、それでも予算やスケジュールの関係だったり、使い続けていたらデータがどんどん増えてしまったりなど、どうしてもSalesforce上だけで表現しなければならないってときがあるのです。わかります。そんな時に使用する方法をご紹介します。

参考:Apexガバナ制限一覧

ガバナ制限の回避方法

Apexバッチとして処理を作成し(=非同期処理)、レコードの取得部分は Database.QueryLocator() を使用する処理を繰り返し呼び出すことで、5万件以上のデータを扱います。

※ただし、処理の中で、5万件以上のデータを扱えるのは1オブジェクトだけになります。

また、注意しないといけないことは、batchスケジューラー側で、第2引数(パラメータ scope)の処理レコード件数を調整することです。これにより メインオブジェクトのレコード件数及び、処理内部で利用する、データの件数を制御しつつ並列処理を実行することができます。

「Database.getQueryLocator によって取得されるレコードの合計数 (非同期処理)10,000件」というガバナ制限があるので、1万件以内で記載しないといけません。処理の記載方法により、その他のガバナ制限に引っかかる可能性があるので、1万件より数値は小さくすることをおすすめします。

Apexバッチサンプル

Apexバッチサンプル

バッチスケジューラーサンプル

バッチスケジューラーサンプル

終わりに

今回は、Apex ガバナ制限 のエラー回避方法についてご紹介致しました。
最後まで読んでいただきありがとうございました。


この記事が参加している募集