【Salesforce】ApexのCPU時間制限エラーに対処する方法

(最終更新月: 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コードの開発を目指しましょう。

常に学び、適応することが、変わりゆくテクノロジーに対応する鍵です。