Apex Cursors vs Apex Batch
カーソルは、クエリ結果をナビゲートするための仮想ポインターのようなものです。大規模なデータセットを管理しやすいチャンクに分割する方法と考えることができます。カーソルは、特に大量のクエリ結果を扱う際に有用であり、データセット全体を一度にメモリに読み込む必要を防ぎます。
カーソルがパフォーマンスを向上させる方法
カーソルは、クエリ結果を段階的に処理することを可能にし、パフォーマンスを向上させます。一度にすべてのレコードを取得する代わりに、小さな部分で取得することができます。このアプローチはいくつかの利点を持ちます:
メモリ効率: 大量の結果セットをメモリに読み込むことはシステムリソースに負担をかける可能性があります。必要なものだけを取得することで、メモリ使用量を削減します。
トランザクションの境界: カーソルは単一のトランザクション内で操作されます。これにより、トランザクションの制限を超えることなくデータを処理することができます。
前方および後方ナビゲーション: カーソルを使用すると、結果セットを前後に移動することができ、効率的なデータ操作を可能にします。
Apexのカーソル:強力なツール
Salesforce Apexでは、カーソルは大規模なクエリ結果を扱うために不可欠です。以下が重要です:
カーソルの作成: Database.getCursor() や Database.getCursorWithBinds() を使用してSOQLクエリを実行すると、カーソルが生成されます。これはクエリ結果を表します。
レコードの取得: Cursor.fetch(integer position, integer count) メソッドは、カーソルから指定された数のレコードを取得します。位置を追跡してデータを段階的に処理します。
制限と例外: Apexカーソルには制限があります。各カーソルは最大5000万行を保持できます。何か問題が発生した場合、System.FatalCursorException や System.TransientCursorException などの例外がエラー処理に役立ちます。
使用例: パッケージ開発者や高度なApexユーザーは、大量処理タスクにカーソルを利用します。これはバッチApexの強力な代替手段です。
Apexカーソルの制限
効率的なリソース管理を保証するために、SalesforceはApexカーソルに以下の制限を設けています:
カーソルあたりの最大行数:5000万
トランザクションあたりの最大フェッチ呼び出し数:10
1日あたりの最大カーソル数:10,000
1日あたりの最大行数(集計制限):1億
実例:QueryChunkingQueuable
大量のContactレコードを処理することを想像してみましょう。カーソルを使用する方法は以下の通りです:
public class QueryChunkingQueuable implements Queueable {
private Database.Cursor locator;
private Integer position;
public QueryChunkingQueuable() {
locator = Database.getCursor('SELECT Id FROM Contact WHERE LastActivityDate = LAST_N_DAYS:400');
position = 0;
}
public void execute(QueueableContext ctx) {
List<Contact> scope = locator.fetch(position, 200);
position += scope.size();
// 希望のアクションを実行(例:アーカイブまたはレコード削除)
if (position < locator.getNumRecords()) {
// 次のチャンクを処理
System.enqueueJob(this);
}
}
}
この例では、Database.getCursor() を使用してSOQLクエリを実行し、最後の400日間の LastActivityDate を持つContactレコードを取得します。execute メソッドでは、次のように操作します:
locator.fetch(position, 200) を使用して一度に200のContactレコードを取得します。
現在の位置(position)を追跡してデータを段階的に処理します。
さらにレコードが残っている場合、処理を続けるために別のジョブをエンキューします。
結論:ApexカーソルとバッチApexの比較
カーソルはバッチApexのように使用することができますが、いくつかの制限がないため、より柔軟です。具体的な違いを見てみましょう。
ナビゲーション
カーソル: カーソルはデータを前方向にも後方向にも移動できるため、柔軟性があります。
バッチApex: バッチApexは、事前に定義されたバッチでのみデータを前方向に移動します。
Queueable Apexチェーンでの使用
カーソル: カーソルは、複雑な処理のためにキューに入れられたジョブのチェーンでシームレスに機能することができます。
バッチApex: バッチApexは通常、単独のジョブとして機能し、チェーンにスムーズに統合されないことがあります。
カーソルは、前後に自由にデータをナビゲートできるため、より複雑なデータ操作が必要な場合に適しています。一方で、バッチApexは一方向のデータ処理に適しており、単純な大量データ処理には便利ですが、柔軟性は劣ります。
このような違いを理解することで、開発者はApexコードのパフォーマンス最適化やリソース管理をより効果的に行うことができるでしょう。カーソルを使った高度なデータ処理アプローチは、特に大規模なデータセットに対して非常に有効です。