1,500万のアカウントレコードがある場合にSOQLクエリを最適化するにはどうすればよいですか?
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
代わりに、これはSOSLの完璧なユースケースです。できるよ:
FIND :phoneNumber
IN PHONE FIELDS
RETURNING Account(
Id
WHERE RecordType.Name='Person Account'
ORDER BY CreatedDate
LIMIT 1
)
注:これらのカスタムフィールドのいずれかが数式フィールドである場合、数式フィールドは検索インデックスが作成されないため、このアプローチではこれらのレコードが失われます。パフォーマンス上の理由から、実際に値を検索対象のレコードにコピーする必要があります。
ちなみに、このステートメントはSOQLでも当てはまります。クエリを選択的にする必要があります。つまり、数式フィールドを使用しないということです。フィルタリングされたすべてのフィールドにインデックスが付けられている限り、データ量が1,500万レコードであっても、元のクエリは問題になりません。