(最終更新月: 2024年2月)
✔以下の疑問をお持ちの方へ向けた記事です
「Salesforceにおけるガバナ制限とは何か?」
「ガバナ制限によってSalesforce開発にどのような影響があるのか?」
「ガバナ制限を遵守しながら効率的に開発を進める方法は?」
✔当記事を読むことで得られる知識
- Salesforceのガバナ制限の基本的な概念
- ガバナ制限の主なカテゴリーとそれぞれの制限事項
- ガバナ制限を遵守するためのベストプラクティスと開発戦略
ガバナ制限は、システムリソースの公平な使用を保証し、パフォーマンスやセキュリティを維持するためのもの。
当記事では、API呼び出し、SOQLクエリ、DML操作など、さまざまな制限事項に焦点を当て、それらを効率的に管理するための戦略やテクニックを提供します。
Salesforceの開発者やアーキテクト、さらには管理者にとって有益な情報が満載です。
ぜひ最後までご覧ください。
ガバナ制限一覧表: 2024年版
ガバナ制限とは、Apex コードがマルチテナント環境で共有リソースを独占しないようにするための制約です。
ガバナ制限について、具体的な数字が知りたいという方のために以下の通り一覧でまとめました。
「ガバナ制限とはなにか」「ガバナ制限で気をつけるべき点は」などの疑問がある方は、後述している内容をご確認ください。
制限の種類 | 同期 Apex の制限値 | 非同期 Apex の制限値 | 認定管理パッケージの制限値 | 補足情報 |
---|---|---|---|---|
SOQL クエリ | 100 | 200 | 100 | サブクエリは追加クエリとみなされる |
SOSL クエリ | 20 | 20 | 20 | |
DML ステートメント | 150 | 150 | 150 | |
DML 行 | 10,000 | 10,000 | 10,000 | |
スクリプトステートメント | 200,000 | 200,000 | 200,000 | |
スタックの深さ | 1,000 | 1,000 | 1,000 | トリガを実行する繰り返しコールは 16 に制限される |
ヒープサイズ | 6 MB | 12 MB | 6 MB | メールサービスのヒープサイズは 36 MB |
CPU 時間 | 10,000 ミリ秒 | 60,000 ミリ秒 | 10,000 ミリ秒 | データベースの時間やコールアウトの待ち時間は含まれない |
SOQL クエリの行 | 50,000 | 50,000 | 50,000 | |
SOSL クエリの行 | 2,000 | 2,000 | 2,000 | |
保存された Apex メソッドのコール | 200 | 200 | 200 | |
@future アノテーションのコール | 50 | 0 | 50 | |
メール送信 | 10 | 10 | 10 | |
プッシュ通知 | 2,000 | 2,000 | 2,000 | |
Apex トリガバッチサイズ | 200 | 200 | 200 | プラットフォームイベントと変更データキャプチャイベントのバッチサイズは 2,000 |
ローカル変数 | 50,000 | 50,000 | 50,000 | |
メソッドのサイズ | 65,535 バイト | 65,535 バイト | 65,535 バイト | |
HTTP コールアウト | 100 | 100 | 100 | |
HTTP 要求のサイズ | 6 MB | 6 MB | 6 MB | |
HTTP 応答のサイズ | 6 MB | 6 MB | 6 MB | |
長時間のトランザクション | 10 | 10 | 10 | |
一括処理ジョブ | 5 | 5 | 5 | |
Flex キューのジョブ | 100 | 100 | 100 | |
キュー可能 Apex ジョブ | 50 | 1 | 50 | |
スケジュール済み Apex ジョブ | 100 | 100 | 100 | |
テストの非同期実行 | 500 | 500 | 500 | |
非同期 Apex 実行 | 250,000 | 250,000 | 250,000 |
2024年2月時点の情報です。
詳細はこちらの公式ページでご確認ください。
ガバナ制限の基本
こちらでは、「ガバナ制限」についてお伝えしていきます。
「ガバナ制限」について理解することで、Salesforceを用いたアプリケーション開発における安全性と効率性を高めるための知識として役立つでしょう。
- ガバナ制限とは何か
- Salesforceにおけるガバナ制限の重要性
- 主なガバナ制限の種類
ガバナ制限とは何か
Salesforceにおける「ガバナ制限」とは、予期せぬプログラムの動きを制限し、システムリソースの過剰使用を防ぐための一連のルールや上限値です。
例えば、Apexコードの一トランザクションで実行できるDML(データ操作言語)ステートメント数には、150という制限があります。(参考: Apexガバナ制限|Salesforce Developer)
DML操作とは以下のようなメソッドで、データベースのデータを操作するものです。
- insert
- update
- upsert
Salesforceにおけるガバナ制限の重要性
Salesforceは多数の企業によって利用されるマルチテナントSaaSプラットフォーム。
この環境で全てのユーザーが平等にリソースを使用できるようにする為、ガバナ制限が設けられているのです。
これにより、一人のユーザーやアプリケーションが過度にシステムリソースを占有することを防げます。
違反すると、エラーメッセージが発生したり、コードが強制終了される可能性があるため、開発においてこれらの制限を遵守することは不可欠です。
ガバナ制限は、try..catchでもうまく受け取れない場合があります。
正しく理解していないと、そのエラーがなぜ発生したかの原因が特定しにくいこともあるでしょう。
主なガバナ制限の種類
Salesforceでは、主に以下のガバナ制限が設けられています。
- Apexの実行時間制限
各Apex処理は最大で10秒のCPU時間を消費できる - SOQLクエリ制限
ひとつのトランザクションで実行できるSOQLクエリは最大100回まで - DML処理の制限
ひとつのトランザクションで実行できるDML操作は150回まで - APIリクエストの制限
24時間あたりのAPIリクエストの数には制限がある
これらはプラットフォーム上での開発をする際に常に配慮すべき点です。
詳しくは次の公式文書を参考にしてください。(実行ガバナと制限|Apex開発者ガイド)
当記事では具体的な対策などについて記載していきます。
ガバナ制限の詳細
こちらでは、Salesforce上で開発を行う際に直面する具体的な「ガバナ制限」について詳しくご説明します。
「ガバナ制限」の詳細を理解することで、Salesforceアプリケーションのパフォーマンスを向上させる方法を見つけられます。
- Apexの実行制限
- SOQLとSOSLの制限
- APIリクエストと同時実行制限
Apexの実行制限
Apexにはいくつかの実行制限があり、たとえば以下のようなルールが存在します。
- CPU時間
一回の同期トランザクションでの最大CPU使用時間は10秒間、非同期トランザクションは60秒間です。 - メモリ使用
Apexヒープサイズとは異なり、一回のトランザクションで使用できるメモリの量にも制限があります。
これらの制限を超えた場合、System.LimitException
というエラーが発生し、トランザクションはロールバックされます。
したがって、コードの最適化や徹底したテストが必要です。
Integer startCpuTime = Limits.getCpuTime();
// 長い処理をするコード...
Integer endCpuTime = Limits.getCpuTime();
System.debug('CPU time used: ' + (endCpuTime - startCpuTime) + 'ms');
このコードのように、Limits
クラスを使用することで、Apexコードが消費しているリソースをモニタリングできます。
参考: Limitsクラス|Apex 開発者ガイド
SOQLとSOSLの制限
SOQL(Salesforce Object Query Language)とSOSL(Salesforce Object Search Language)は、データベースから情報を取得するために使用されますが、これらにも制限があります。
- SOQLクエリ
トランザクションごとに実行できるSOQLクエリの数は最大で100 - SOSLクエリ
トランザクションごとに最大で20のSOSLクエリが許されている
適切なデータベース設計とクエリ計画を実行しない場合、下記のようなクエリは非効率的でガバナ制限に引っかかる可能性が高くなります。
こちらはSOQLの例です。
List<Account> accounts = [SELECT Id, Name FROM Account LIMIT 50000];
SOSLの例はこちら。
FIND {'Acme*'}
IN ALL FIELDS
RETURNING
Account(Id, Name),
Contact(Id, Name, Email),
Opportunity(Id, Name, StageName, CloseDate)
このような大量のレコードを一度に取得しようとする代わりに、バッチ処理を用いるなどの対策が必要です。
APIリクエストと同時実行制限
SalesforceのAPIは、外部アプリケーションがプラットフォームと通信するために使用されますが、APIリクエストには次のような制限があります。
- 24時間のAPIリクエスト
エディションによって異なりますが、24時間あたり数千から数万回に限定されています。 - 同時実行APIリクエスト
同時に許可されるAPIの呼び出し数には上限があり、システムの過負荷を防ぐために設定されています。
curl https://your_instance.salesforce.com/services/data/vXX.0/sobjects/Account/ -H ""Authorization: Bearer your_access_token""
上記のようなcURLコマンドを使ったAPIリクエストの際も、これらの制限に注意する必要があります。
ガバナ制限の管理と回避
Salesforceで安定したアプリケーションを構築するためには、ガバナ制限を適切に管理し、計画的に回避する必要があります。
ガバナ制限を上手く管理し、限界を超えない開発をおこなうためのヒントやテクニックを見ていきましょう。
- コード最適化による制限の管理
- バッチ処理とキュー処理
- ベストプラクティスと戦略
コード最適化による制限の管理
コードの最適化は、ガバナ制限にひっかかることなく効率的なプログラムを作成するための鍵です。
例えば、ループの中でSOQLクエリを書くのではなく、ループの外で実行することでクエリを減らせます。
List<Id> contactIds = new List<Id>();
for (Contact c : [SELECT Id FROM Contact WHERE AccountId = :someAccountId]) {
contactIds.add(c.Id);
}
// ループの外でSOQLを実行
List<Task> tasks = [SELECT Id FROM Task WHERE WhatId IN :contactIds];
このような集約とプリフェッチ戦略を用いることで、SOQLクエリの回数の大幅ば削減が可能です。
バッチ処理とキュー処理
単一の操作で処理できるレコード数には限界があるため、大量のデータを扱う場合はバッチ処理を利用することが推奨されます。
また、非同期処理であるキュー処理を用いて、システムの負荷を分散させることも重要です。
global class ContactBatch implements Database.Batchable<Contact> {
global Database.QueryLocator start(Database.BatchableContext BC) {
return Database.getQueryLocator([SELECT Id FROM Contact]);
}
global void execute(Database.BatchableContext BC, List<Contact> scope) {
// バッチ処理されるContactの処理
}
global void finish(Database.BatchableContext BC) {
// バッチ処理完了後の処理
}
}
上記のコードでは、Database.Batchable
インターフェースを実装することで、Salesforce内でのバッチ処理を定義しています。
これにより、ガバナ制限を回避しながら膨大な数のレコードを効率よく処理できます。
ベストプラクティスと戦略
Salesforceのガバナ制限を回避するためのベストプラクティスには、コードの再利用、共有変数の活用、テストクラスの規律正しい実装などがあります。また、制限を回避するための戦略として、例えば以下のような方法があります。
- 処理の非同期化
FutureメソッドやQueueableインターフェース、スケジュールされたジョブを使用して処理を非同期化。 - バルクAPI利用
大量のデータインポートやエクスポート時にはバルクAPIを利用し、APIリクエストの数を削減。
開発においてこれらのベストプラクティスと戦略を活用することで、ガバナ制限に違反することなく、安定したアプリケーション運営が可能になります。
ガバナ制限のトラブルシューティング
こちらでは、Salesforceのガバナ制限に関するトラブルシューティングの方法やツールの使い方をご紹介します。
プログラミングやシステム設計をおこなううえで、時にはガバナ制限に関連するエラーや問題に直面することがあるからです。
- 一般的なガバナ制限関連のエラー
- 監視と解析ツールの使用
- エラー解決のアプローチ
一般的なガバナ制限関連のエラー
Salesforceで開発を行なっていると、ガバナ制限に関連する一般的なエラーに遭遇することがあります。
System.LimitException: Too many SOQL queries: 101
こちらは許可されたSOQLクエリの数を超えてしまったことを意味します。
このようなエラーに直面したときは、コードの見直しを行い、クエリの数を減らす必要があります。
監視と解析ツールの使用
Salesforceには、システムパフォーマンスを監視し、トラブルシューティングをおこなうための便利なツールが数多く用意されています。
Developer Consoleのログ分析機能や、Apex Profilerといったツールを使用すると、どのような処理でリソースの使用量が増えるのかを理解するのに役立つはずです。
エラー解決のアプローチ
具体的なエラー内容を把握したあとは、対処法を考える必要があります。
一般的には以下の順序で問題解決を進めてください。
- エラーの再現
テストクラスや実行可能なスクリプトを使って、エラーを再現し詳細情報を取得します。 - 原因の特定
適切なツールや手法を利用して、リソースの過剰消費や論理的な間違いを確認します。 - 解決策の実装
最適化やコードの書き換えを行ない、エラーが起こらないよう修正します。
これらのアプローチを順番に実施することで、問題の根本原因に近づき、解決へと導きます。
ガバナ制限の将来と最新動向
こちらでは、ガバナ制限の未来や最新動向についてご紹介します。
Salesforceは絶えず進化しており、それに伴いガバナ制限も変更がおこなわれることがあるのです。
- Salesforceのアップデートに伴う変化
- 最新のベストプラクティスとリソース
- コミュニティとサポート
Salesforceのアップデートに伴う変化
Salesforceは年に数回のアップデートをおこない、新機能の追加や既存機能の改善がされます。
それに伴い、ガバナ制限も更新が行われることがしばしば起こり得ます。
たとえば、過去のリリースでApexのCPU時間制限やSOQLクエリの上限が引き上げられたことがあります。
このような変更に迅速に対応するためには、リリースノートをこまめにチェックし、変更点を把握しておくことが重要です。
最新のベストプラクティスとリソース
Salesforce開発においては、ガバナ制限の基準や最適なコーディング手法も時間と共に変化するため、それらを逐一更新し、最新の情報を把握することが大事です。
Salesforceの公式ドキュメント、開発者ブログ、コミュニティフォーラムといったリソースを有効利用し、長期にわたって最良のプラクティスを適用しましょう。
例えば、TrailheadはSalesforceの学習プラットフォームであり、現代の開発者や管理者がスキルを身につけ、情報を更新するための素晴らしいツールです。
常に最新傾向を把握するために、定期的にTrailheadのコンテンツを閲覧することが推奨されます。
コミュニティとサポート
Salesforceは活動的な開発者コミュニティを有しており、豊富な経験と知識が共有されています。
ガバナ制限に関する疑問や困難に直面している場合、コミュニティのフォーラムやイベントで助言を求められるでしょう。
また、コミュニティを通じてSalesforceが提供するサポートチームと接点を持つことも可能です。
このフォーラムでは、Salesforceに関する様々な話題について、世界中の開発者と交流できます。
まとめ
Salesforceのガバナ制限は、プラットフォームの安定性と公平性を保つために不可欠な部分です。
これらの制限に適切に対処し、効率よくコーディングするためには、理解と計画が必要です。
常にアップデートされる最新情報の追跡とコミュニティとの協力を通じて、生産的なSalesforceアプリケーション開発を目指しましょう。