【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 ガバナ制限 のエラー回避方法についてご紹介致しました。
最後まで読んでいただきありがとうございました。