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

LastModifiedDate と SystemModStamp の違いを知る

公開日: Nov 27, 2024
説明
※この記事は英語版を翻訳しており、一部機械翻訳を含むため内容は後日更新される可能性があります。最新の内容は英語版を参照してください。表示言語は画面右下の言語名から切り替えられます。
 

SystemModStamp と LastModifiedDate は類似の動作をするシステム項目ですが、プロパティは若干異なります。アプリケーションを拡張し、大量のデータを処理できるようにするには、SOQL フィルタでこれらを使用する際に、どちらか一方の項目を選択することによるパフォーマンスへの影響を理解することが重要です。 

解決策

LastModifiedDate と SystemModStamp の違いは何ですか?

LastModifiedDate と SystemModStamp の日付について復習します。どちらも各レコードの日付と時刻の値を保存するシステム項目 です。
  • LastModifiedDate は、ユーザーがレコードを作成または更新するたびに自動的に更新されます。ビジネスで Salesforce へのデータ移行時に元のタイムスタンプを保持する必要がある場合は、LastModifiedDate を任意の過去の日付に変更できます。
  • SystemModStamp は完全に読み取り専用です。ユーザーがレコードを更新したときだけでなく、自動化されたシステムプロセス (トリガー、ワークフローアクションなど) がレコードを更新したときにも更新されます。この動作により、「LastModifiedDate <= SystemModStamp」の場合は保存値に違いが生じますが、「LastModifiedDate > SystemModStamp」の場合は違いが生じません。
 

LastModifiedDate 検索条件は SOQL のパフォーマンスにどのような影響を与えますか?

これは SOQL クエリのパフォーマンスにどのような影響を与えるでしょうか? 内部では、SystemModStamp にはインデックスが付きますが、LastModifiedDate にはインデックスが付きません。Salesforce クエリオプティマイザーは、SOQL クエリが LastModifiedDate で絞り込まれている場合でも、SystemModStamp のインデックスの使用をインテリジェントに試みます。ただし、SOQL クエリ検索条件が日付範囲の上限を決定するために LastModifiedDate を使用する場合、SystemModStamp が LastModifiedDate よりも大きい (より後の日付である) 場合があるため、クエリオプティマイザーではインデックスを使用できません。これは、2 つのタイムスタンプの間にあるレコードの見逃しを防ぐことを目的としています。
明確にするために例を挙げて説明します。

クエリオプティマイザーで SystemModStamp のインデックスを使用するため、検索条件が選択しきい値を満たす限り、以下のクエリは適切に実行されます。

1Select Id, Name from Account where LastModifiedDate > 2014-11-08T00:00:00Z
1Select Id, Name from Account where LastModifiedDate = CustomDate__c
以下の例では、クエリオプティマイザーで SystemModStamp のインデックスを使用できないため、パフォーマンスを最適化できません。
1Select Id, Name from Account where LastModifiedDate CutoffDate__c
日付リテラルを使用する場合にも同じロジックが適用されます。注意点として、SOQL に 1 つ以上の選択的検索条件がある場合、クエリオプティマイザーではその検索条件を先頭検索条件として使用できるため、最適でない LastModifiedDate 検索条件で日付範囲の下限を定義していても、クエリは適切に実行されます。
選択と SOQL クエリの調整方法についての詳細は、以下の関連リソースを参照してください。

LastModifiedDate のパフォーマンスを最適化するオプション

パフォーマンスを最適化する最も簡単で効果的な方法は、LastModifiedDate の代わりに SystemModStamp を使用してデータを絞り込むことです。ただし、クエリの対象オブジェクトで SystemModStamp を利用できない場合や、ビジネス要件のために 2 つの項目を置き換えることができない場合があります。また、他のスケーラビリティの問題にも対処できるよう、異なるアプローチを検討する必要がある場合もあります。SOQL クエリのパフォーマンスとスケーラビリティを最適化するのに役立つオプションをいくつかご紹介します。
  • カスタム日付項目を使用する: ワークフロー項目の更新またはトリガーを使用して LastModifiedDate 値をコピーし、サポートに連絡してカスタム項目にカスタムインデックスを追加するよう依頼します。そして、それを検索条件として使用します。
  • スキニーテーブルを追加する: データ量が多いためにパフォーマンスに問題がある場合は、スキニーテーブルの追加を検討します。スキニーテーブルにはデフォルトでインデックス付き LastModifiedDate が含まれています。
  • LastActivityDate の検索条件: ビジネス要件がアクティビティに関連する [アカウント] または [取引先責任者] レコードをリストアップすることであり、スキニーテーブルがある (または用意する予定である) 場合は、サポートに連絡して LastActivityDate 項目のインデックスをリクエストします。
  • データのレプリケーション API を使用する: たとえば getUpdated() を使用して更新されたレコードを取得します。内部では、API は SystemModStamp を使用して一致するレコードを決定し、それが存在しない場合は自動的に LastModifiedDate または CreatedDate を使用します。
どちらの方法を取る場合でも、SystemModStamp ではなく LastModifiedDate を使用する場合は、ビジネス要件および考えられるパフォーマンスへの影響を慎重に評価する必要があります。

関連リソース

ナレッジ記事番号

000386977

 
読み込み中
Salesforce Help | Article