Bagaimana cara Mengoptimalkan Kueri SOQL ketika saya memiliki 15 juta catatan Akun?

Aug 15 2020

Saya memiliki kasus penggunaan di mana saya mengekspos layanan Istirahat khusus yang akan menerima telepon # sebagai argumen dan membandingkan dengan lima bidang telepon # di Akun dan akan mengembalikan satu catatan yang cocok dengan salah satu dari lima telepon #. Dalam kasus, jika beberapa catatan ditemukan, catatan yang paling awal dibuat harus dikembalikan. Satu-satunya kekhawatiran / masalah saya adalah ketika ini masuk ke produksi, itu tidak akan berfungsi / akan ada masalah kinerja karena ada 15 juta catatan Akun. Saya mungkin dapat mengindeks bidang, tetapi apakah itu benar-benar membantu ketika jumlah catatan sangat tinggi? Saya akan sangat menghargai saran / bantuan untuk mengoptimalkan SOQL ini.

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: Saya sudah bertanya kepada tim Biz apakah kami hanya dapat memiliki satu bidang telepon # saat perbandingan. Tapi mereka bersikukuh dengan lima bidang.

Jawaban

3 sfdcfox Aug 15 2020 at 19:51

Ini adalah kasus penggunaan yang sempurna untuk SOSL. Anda dapat melakukan:

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

Catatan: Jika salah satu bidang kustom tersebut adalah bidang rumus, pendekatan ini akan kehilangan catatan tersebut, karena bidang rumus tidak diindeks dengan pencarian. Anda harus benar-benar menyalin nilai ke catatan yang sedang dicari untuk alasan kinerja.

Pernyataan ini akan tetap benar dengan SOQL, omong-omong; Anda perlu membuat kueri selektif, yang berarti tidak menggunakan bidang rumus. Selama semua bidang yang difilter diindeks, kueri asli Anda seharusnya tidak menjadi masalah, bahkan pada 15 juta catatan volume data.