1,500万のアカウントレコードがある場合にSOQLクエリを最適化するにはどうすればよいですか?

Aug 15 2020

phone#を引数として受け入れ、Accountの5つのphone#フィールドと比較し、5つのphone#のいずれかに一致する単一のレコードを返すカスタムRestサービスを公開するユースケースがあります。複数のレコードが見つかった場合は、最も早く作成されたレコードを返す必要があります。私の唯一の懸念/問題は、これが本番環境に移行したときに機能しないことです。1500万のアカウントレコードがあるため、パフォーマンスの問題が発生します。私はおそらくフィールドにインデックスを付けることができますが、レコード数が非常に多い場合、それは本当に役立ちますか?このSOQLを最適化するための提案/ヘルプをいただければ幸いです。

SOQL:

[SELECT Id 
FROM Account 
WHERE RecordType=’Person Account’ 
AND (Parent_Phone_Number__c= :phoneNo OR Student_Phone_Number__c= :phoneNo OR 
Alternate_Number_1__c= :phoneNo OR Alternate_Number_2__c= :phoneNo OR 
Alternate_Number_3__c= :phoneNo)
ORDER BY CreatedDate DESC 
LIMIT 1];

PS:比較している間、電話番号フィールドを1つだけ持つことができるかどうかはすでにBizチームに尋ねました。しかし、彼らは5つの分野に固執しています。

回答

3 sfdcfox Aug 15 2020 at 19:51

代わりに、これはSOSLの完璧なユースケースです。できるよ:

FIND :phoneNumber 
IN PHONE FIELDS
RETURNING Account(
  Id 
  WHERE RecordType.Name='Person Account'
  ORDER BY CreatedDate
  LIMIT 1
)

注:これらのカスタムフィールドのいずれかが数式フィールドである場合、数式フィールドは検索インデックスが作成されないため、このアプローチではこれらのレコードが失われます。パフォーマンス上の理由から、実際に値を検索対象のレコードにコピーする必要があります。

ちなみに、このステートメントはSOQLでも当てはまります。クエリを選択的にする必要があります。つまり、数式フィールドを使用しないということです。フィルタリングされたすべてのフィールドにインデックスが付けられている限り、データ量が1,500万レコードであっても、元のクエリは問題になりません。