Salesforceのガバナ制限とは?主な内容とその対策

※本サイトにはプロモーション・広告が含まれています。

(最終更新月: 2024年2月)

✔以下の疑問をお持ちの方へ向けた記事です

「Salesforceにおけるガバナ制限とは何か?」
「ガバナ制限によってSalesforce開発にどのような影響があるのか?」
「ガバナ制限を遵守しながら効率的に開発を進める方法は?」

✔当記事を読むことで得られる知識

  • Salesforceのガバナ制限の基本的な概念
  • ガバナ制限の主なカテゴリーとそれぞれの制限事項
  • ガバナ制限を遵守するためのベストプラクティスと開発戦略

ガバナ制限は、システムリソースの公平な使用を保証し、パフォーマンスやセキュリティを維持するためのもの。

当記事では、API呼び出し、SOQLクエリ、DML操作など、さまざまな制限事項に焦点を当て、それらを効率的に管理するための戦略やテクニックを提供します。

Salesforceの開発者やアーキテクト、さらには管理者にとって有益な情報が満載です。

ぜひ最後までご覧ください。

Salesforce

定義や属性などは公式ガイドを必ず参考にしましょう。

当記事では、主にその使い方を具体例とともに解説します。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

プロダクトマネージャーとして、Apex・Visualforceの開発エンジニアとして、以下のようなプロジェクトに従事してきました

  • 新規事業の立ち上げに伴うビジネスプロセス構築とSalesforceのカスタマイズ
  • SFDXを活用した大規模リリース
  • Visualforce等による一般ユーザー向けサイト・アプリケーションの構築

相談・業務の依頼も承ります。ご質問・ご希望をお問い合わせください。

ガバナ制限一覧表: 2024年版

ガバナ制限とは、Apex コードがマルチテナント環境で共有リソースを独占しないようにするための制約です。

ガバナ制限について、具体的な数字が知りたいという方のために以下の通り一覧でまとめました。

「ガバナ制限とはなにか」「ガバナ制限で気をつけるべき点は」などの疑問がある方は、後述している内容をご確認ください。

制限の種類同期 Apex の制限値非同期 Apex の制限値認定管理パッケージの制限値補足情報
SOQL クエリ100200100サブクエリは追加クエリとみなされる
SOSL クエリ202020
DML ステートメント150150150
DML 行10,00010,00010,000
スクリプトステートメント200,000200,000200,000
スタックの深さ1,0001,0001,000トリガを実行する繰り返しコールは 16 に制限される
ヒープサイズ6 MB12 MB6 MBメールサービスのヒープサイズは 36 MB
CPU 時間10,000 ミリ秒60,000 ミリ秒10,000 ミリ秒データベースの時間やコールアウトの待ち時間は含まれない
SOQL クエリの行50,00050,00050,000
SOSL クエリの行2,0002,0002,000
保存された Apex メソッドのコール200200200
@future アノテーションのコール50050
メール送信101010
プッシュ通知2,0002,0002,000
Apex トリガバッチサイズ200200200プラットフォームイベントと変更データキャプチャイベントのバッチサイズは 2,000
ローカル変数50,00050,00050,000
メソッドのサイズ65,535 バイト65,535 バイト65,535 バイト
HTTP コールアウト100100100
HTTP 要求のサイズ6 MB6 MB6 MB
HTTP 応答のサイズ6 MB6 MB6 MB
長時間のトランザクション101010
一括処理ジョブ555
Flex キューのジョブ100100100
キュー可能 Apex ジョブ50150
スケジュール済み Apex ジョブ100100100
テストの非同期実行500500500
非同期 Apex 実行250,000250,000250,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といったツールを使用すると、どのような処理でリソースの使用量が増えるのかを理解するのに役立つはずです。

エラー解決のアプローチ

具体的なエラー内容を把握したあとは、対処法を考える必要があります。

一般的には以下の順序で問題解決を進めてください。

  1. エラーの再現
    テストクラスや実行可能なスクリプトを使って、エラーを再現し詳細情報を取得します。
  2. 原因の特定
    適切なツールや手法を利用して、リソースの過剰消費や論理的な間違いを確認します。
  3. 解決策の実装
    最適化やコードの書き換えを行ない、エラーが起こらないよう修正します。

これらのアプローチを順番に実施することで、問題の根本原因に近づき、解決へと導きます。

ガバナ制限の将来と最新動向

こちらでは、ガバナ制限の未来や最新動向についてご紹介します。

Salesforceは絶えず進化しており、それに伴いガバナ制限も変更がおこなわれることがあるのです。

  • Salesforceのアップデートに伴う変化
  • 最新のベストプラクティスとリソース
  • コミュニティとサポート

Salesforceのアップデートに伴う変化

Salesforceは年に数回のアップデートをおこない、新機能の追加や既存機能の改善がされます。

それに伴い、ガバナ制限も更新が行われることがしばしば起こり得ます。

たとえば、過去のリリースでApexのCPU時間制限やSOQLクエリの上限が引き上げられたことがあります。

このような変更に迅速に対応するためには、リリースノートをこまめにチェックし、変更点を把握しておくことが重要です。

最新のベストプラクティスとリソース

Salesforce開発においては、ガバナ制限の基準や最適なコーディング手法も時間と共に変化するため、それらを逐一更新し、最新の情報を把握することが大事です。

Salesforceの公式ドキュメント、開発者ブログ、コミュニティフォーラムといったリソースを有効利用し、長期にわたって最良のプラクティスを適用しましょう。

例えば、TrailheadはSalesforceの学習プラットフォームであり、現代の開発者や管理者がスキルを身につけ、情報を更新するための素晴らしいツールです。

Trailhead | The fun way to learn
Trailhead is the fun way to learn

常に最新傾向を把握するために、定期的にTrailheadのコンテンツを閲覧することが推奨されます。

コミュニティとサポート

Salesforceは活動的な開発者コミュニティを有しており、豊富な経験と知識が共有されています。

ガバナ制限に関する疑問や困難に直面している場合、コミュニティのフォーラムやイベントで助言を求められるでしょう。

また、コミュニティを通じてSalesforceが提供するサポートチームと接点を持つことも可能です。

Feed | Questions | Salesforce Trailblazer Community
Trailhead, the fun way to learn Salesforce

このフォーラムでは、Salesforceに関する様々な話題について、世界中の開発者と交流できます。

まとめ

Salesforceのガバナ制限は、プラットフォームの安定性と公平性を保つために不可欠な部分です。

これらの制限に適切に対処し、効率よくコーディングするためには、理解と計画が必要です。

常にアップデートされる最新情報の追跡とコミュニティとの協力を通じて、生産的なSalesforceアプリケーション開発を目指しましょう。

タイトルとURLをコピーしました