Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

初期設定における SOQL 実行時の LastModifiedDate と SystemModStamp のインデックス利用について

公開日: Feb 14, 2025
説明
LastModifiedDate を WHERE 句に指定してもクエリの実行に時間がかかるのはなぜですか?
解決策
レコードの更新日時を記録する標準のシステム項目として LastModifiedDate と SystemModStamp が存在します。
この近い意味合いを持つ 2 つの項目の違いとしては、更新されるタイミングとインデックスの保持状況が挙げられます。
※更新タイミングの違いについては こちら の記事をご参照ください。

SystemModStamp はインデックスが保持されていますが、LastModifiedDate は初期設定ではインデックスが保持されておりません。
これが LastModifiedDate を WHERE 句に指定した場合にクエリのパフォーマンスが改善しない理由となります。

しかしながら、特定の条件を満たした場合、LastModifiedDate を WHERE 句に指定した場合でも初期設定の状態でインデックスの効果を得る事ができます。

これは、LastModifiedDate を WHERE 句に指定した際に、クエリオプティマイザは近い意味合いをもつ SystemModStamp のインデックスが使用可能かを確認する動作となるためです。
クエリオプティマイザは、WHERE 句の条件を LastModifiedDate から SystemModStamp に置き換えた場合でも選択されるレコードに過不足が発生しない場合に限り、SystemModStamp のインデックスを使用してクエリを実行します。

LastModifiedDate でインデックスが使用される条件は、WHERE 句での比較が、比較対象の日付項目と下記の関係性になる場合のみとなります。
 
LastModifiedDate > DateField
LastModifiedDate = DateField

一方で、下記のような関係性となる場合は、SystemModStamp のインデックスは使用されません。
 
LastModifiedDate < DateField

これは前述している更新されるタイミングの違いにより、LastModifiedDate と SystemModStamp で、下記の条件となるレコードが存在し得るため、
SystemModStamp に置き換えてクエリを実行することにより、レコードの欠損が発生する可能性があるためです。
 
LastModifiedDate < SystemModStamp

例えば、自動化プロセスによって SystemModStamp のみが更新された、下記のようなレコードが存在するとします。
 
SystemModStamp: 2015-01-01
LastModifiedDate: 2014-01-01

このレコードを下記のようなクエリで選択しようとしたとします。
 
SELECT Id FROM Object WHERE LastModifiedDate < 2014-02-01

仮にこのクエリを SystemModStamp に置き換えて実行しようとした場合、ターゲットとなるレコードは選択されません。
 
// LastModifiedDate では条件を満たすものの SystemModStamp の値の方が大きいため、本来選択されるべきレコードが選択されない。
SELECT Id FROM Object WHERE SystemModStamp < 2014-02-01

以上のことから、初期設定の状態で LastModifiedDate を WHERE 句に指定する場合は比較演算子の考慮が必要となります。
 
ナレッジ記事番号

000383513

 
読み込み中
Salesforce Help | Article