Apexは、Salesforceプラットフォーム上で動作するサーバーサイドプログラミング言語であり、Salesforceデータと操作を自動化するために使用されます。Apexには多くの制限(ガバナ制限)があり、これらの制限は、プラットフォームのパフォーマンスを保護し、他のユーザーに悪影響を与えないようにするために設けられています。
以下に、いくつかのApex制限と、それぞれの制限がどのような影響を与えるかを具体的な例を使って説明します。
1. SOQLクエリの制限
制限: 1回のトランザクションで実行できるSOQLクエリの数は、最大100件までです。
例:
public void myMethod() {
for (Integer i = 0; i < 150; i++) {
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Name LIKE 'Test%'];
// ここで、他の処理を実行
}
}
このコードは、SOQLクエリを150回実行しようとしていますが、Apexでは1回のトランザクションで100回以上のSOQLクエリを実行することができないため、ガバナ制限を超えてエラーになります。
解決策:
クエリをループの外に移動し、リストを使ってバッチで処理します。
public void myMethod() {
List<Account> accounts = [SELECT Id, Name FROM Account WHERE Name LIKE 'Test%'];
for (Account acc : accounts) {
// ここで、他の処理を実行
}
}
これにより、クエリは1回だけ実行され、制限を超えることはありません。
2. DML操作の制限
制限: 1回のトランザクションで実行できるDMLステートメントの数は、最大150件までです。
例:
public void myMethod() {
for (Integer i = 0; i < 200; i++) {
Account acc = new Account(Name='Test' + i);
insert acc;
}
}
このコードは、200回のDML操作を実行しようとしますが、150回の制限を超えているため、エラーになります。
解決策:
バッチインサートを使用して、複数のレコードを一度に挿入します。
public void myMethod() {
List<Account> accounts = new List<Account>();
for (Integer i = 0; i < 200; i++) {
accounts.add(new Account(Name='Test' + i));
}
insert accounts;
}
これにより、DMLステートメントの回数を1回に減らすことができ、制限を超えません。
3. CPU時間の制限
制限: 1回のトランザクションで使用できるCPU時間は、最大10秒(同期トランザクションの場合)です。
例:
public void myMethod() {
Long sum = 0;
for (Long i = 0; i < 1000000000; i++) {
sum += i;
}
}
このループは大量のCPU時間を消費し、10秒の制限を超えてしまう可能性があります。
解決策:
ロジックを最適化するか、バッチApexを使用して処理を分割します。
public void myMethod() {
Long sum = 0;
for (Long i = 0; i < 1000000; i++) {
sum += i;
}
}
ループの範囲を小さくするか、バッチApexで大規模な処理を分割します。
4. コレクションの制限
制限: リスト、セット、マップに保存できる項目の最大数は、50,000件です。
例:
public void myMethod() {
List<Account> accounts = new List<Account>();
for (Integer i = 0; i < 60000; i++) {
accounts.add(new Account(Name='Test' + i));
}
}
60,000件の項目をリストに追加しようとしており、50,000件の制限を超えています。
解決策:
コレクションのサイズを縮小し、必要な項目だけを保持するようにするか、必要に応じて処理を分割します。
public void myMethod() {
List<Account> accounts = new List<Account>();
for (Integer i = 0; i < 50000; i++) {
accounts.add(new Account(Name='Test' + i));
}
}
制限内で動作するように項目の数を調整します。
まとめ
Apexでは、Salesforceのプラットフォームのリソースを公平に使用し、システムの安定性を確保するために、さまざまなガバナ制限が設けられています。これらの制限を理解し、適切にコーディングすることで、エラーを回避し、パフォーマンスを最適化することができます。
従来の開発は、プロジェクトのデータ量によって、パフォーマンスに触ることが少ないかもしれません。
SaaSのサービスを使うと、実感しました。エンドユーザーの体験など、常にパフォーマンスを頭に入れて開発しましょう。