(最終更新月: 2024年2月)
✔以下の疑問をお持ちの方へ向けた記事です
「Salesforce ApexでCPU時間制限を超過する原因は何か?」
「CPU時間制限を超過した際に発生する問題とその影響は?」
「CPU時間制限を超過しないようにするためのベストプラクティスは?」
✔当記事を読むことで得られる知識
- Salesforce ApexのCPU時間制限についての基本情報
- CPU時間制限を超過する一般的な原因とその対策方法
- パフォーマンスを最適化するためのベストプラクティス
Salesforceでは、Apexコードの実行に対して厳格なCPU時間制限が設けられており、この制限を超過すると処理が強制終了されます。
大量のデータを扱うバッチ処理やトリガー、ループ処理の最適化など、具体的な改善策とベストプラクティスを提供します。
Salesforceの開発者がパフォーマンスの問題に直面したときに、効果的に対処するためのガイドラインです。
ぜひ最後までご覧ください。
Salesforce ApexのCPU時間制限とは
Salesforce ApexにおけるCPU時間制限について解説します。
この制限を理解して対処することは、Apexコードの安定性やパフォーマンスの維持に非常に重要です。
- CPU時間制限超過エラーの概要
- SalesforceにおけるCPU時間の計算方法
- CPU時間制限に影響を与える主な要因
CPU時間制限超過エラーの概要
SalesforceのApexコードには、サーバーのリソースを適切に利用するための制限があります。
そのひとつがCPU時間制限です。
- 同期トランザクションでは10秒
- 非同期トランザクションでは60秒
CPU時間は実際のコードの実行時間で、ウェイトタイム(HTTP calloutsやデータベース処理等の待機時間)は含まれません。
制限を超えると次のようなエラーメッセージが発生します。
System.LimitException: Apex CPU time limit exceeded
SalesforceにおけるCPU時間の計算方法
SalesforceはApexコードの実行にかかるCPU時間を細かく計算します。
このCPU時間に含まれるものは、以下などのApexが直接コントロールする全処理です。
- トリガー
- SOQLクエリ、
- DML操作
例えば、for
ループ内でSOQLクエリを実行すると、各繰り返しのクエリ時間が合算されCPU時間として計上されます。
CPU時間制限に影響を与える主な要因
数多くの要因がApexのCPU時間に影響を及ぼします。
主な要因には、コード内で行われるループの回数、SOQLクエリの量と複雑さ、DML操作の回数、Apexトリガの呼び出し数などがあります。
これらを最適化することでCPU時間を抑制し、エラーを避けられます。
CPU時間制限超過エラーの予防策
適切なコードの書き方と最適化策を理解して実践することで、CPU時間制限超過エラーの発生リスクを減らせます。
具体的な予防策は以下のとおりです。
- 効率的なコードの書き方
- Apexコードの最適化テクニック
- パフォーマンス監視ツールの活用
効率的なコードの書き方
効率的なコードを書くためには、以下のようなテクニックが使えます。
- SOQLクエリをループの外に置く
- 必要なフィールドのみを取得する
- 極力DML操作をバッチ処理する
例えば、以下のコードスニペットでは、必要最低限のフィールドを指定し、ループ外でSOQLクエリを実施しています。
List<Account> accounts = [SELECT Id, Name FROM Account WHERE ...];
for (Account a : accounts) {
// 処理を行う
}
Apexコードの最適化テクニック
Apexコードを最適化するテクニックとして、以下のようなものがあります。
- MapやSetの使用
- クエリセレクティビティの向上
- Test.startTest()およびTest.stopTest()を利用したトランザクション制御
これらを使いこなすことで、必要なデータのみを効率良く扱い、リソース消費を抑制することが可能です。
例えばMapやSetを使うことで、SOQLクエリをループ外にし、最適化をおこないます。
パフォーマンス監視ツールの活用
Salesforceでは、実行時間やリソース消費を追跡し、ボトルネックを特定することが重要です。
リアルタイムでコードのパフォーマンスを監視・改善を心がけましょう。
具体的にはSalesforceで提供されるさまざまなパフォーマンス監視ツールを利用できます。
- Developer Consoleのログアナライザ
- 制限監視ツール
CPU時間制限超過エラーのトラブルシューティング
エラーが発生した場合の対処法を知り、迅速に問題を解決しましょう。
トラブルシューティングの手順は次のとおりです。
- エラーの特定と分析
- コードリファクタリングと最適化
- テストと監視
エラーの特定と分析
CPU時間制限超過エラーが発生した際には、Developer ConsoleのログやApex Profilingツールを使いエラー発生箇所を特定します。
どの処理でどれだけのCPU時間を使用しているのかを正確に知ることが、エラー解決の第一歩です。
コードリファクタリングと最適化
問題の特定ができたら、コードリファクタリングをおこない、以下の最適化を施します。
- 不要なSOQLクエリの削除
- ループの効率化
- メソッドの分割
既存のコードに対してリファクタリングをおこなう例は以下のとおりです。
// Before refactoring
for (Contact c : [SELECT Id, (SELECT Id FROM Opportunities) FROM Contact WHERE ...]) {
for (Opportunity o : c.Opportunities) {
// 処理を行う
}
}
// After refactoring
Map<Id, Contact> contactMap = new Map<Id, Contact>([SELECT Id, (SELECT Id FROM Opportunities) FROM Contact WHERE ...]); //...にはSOQLの条件が入る
for (Id contactId : contactMap.keySet()) {
Contact c = contactMap.get(contactId);
for (Opportunity o : c.Opportunities) {
// 処理を行う
}
}
テストと監視
最適化後もテストクラスをわかりやすく用意し、Apexテストの実行を通じてコードの安定性を保証します。
また、定期的な監視により、パフォーマンスの変化に注意を払うことが重要です。
CPU時間制限超過のベストプラクティスと追加リソース
コードのパフォーマンスと品質を維持するためのベストプラクティスと追加リソースを紹介します。
これらの指針は、より効率的なコード開発への道を照らすものです。
- コーディングスタンダードの遵守
- コミュニティと公式ドキュメントの活用
- 継続的な学習とアップデート
コーディングスタンダードの遵守
一貫性のあるコーディングスタンダードを守ることは、コードの可読性と保守性を高める上で不可欠です。
明確な命名規則、コードフォーマット、コメントの利用などが良いコーディング習慣の例となります。
コミュニティと公式ドキュメントの活用
Salesforce開発者コミュニティやStack Exchangeなどのフォーラム、そしてSalesforce公式ドキュメントは、学習と疑問解決のための重要なリソースです。
これらを活用して知識を深め、他の開発者と知見を共有しましょう。
継続的な学習とアップデート
Salesforceプラットフォームは常に進化しているため、最新のトレンドやアップデートに敏感になることが重要です。
Trailheadなどの学習プラットフォームを使用し、スキルセットを継続して向上させましょう。
まとめ
Salesforce ApexのCPU時間制限はApexコードの品質と実行効率に直結する重要な指標です。
当記事で紹介したCPU時間制限の理解、予防策、トラブルシューティング、ベストプラクティスを通じて、安定して高速なApexコードの開発を目指しましょう。
常に学び、適応することが、変わりゆくテクノロジーに対応する鍵です。