Comment optimiser la requête SOQL lorsque j'ai 15 millions d'enregistrements de compte ?
J'ai un cas d'utilisation où j'expose un service Rest personnalisé qui accepterait le numéro de téléphone comme argument et le comparerait avec les cinq champs de numéro de téléphone sur le compte et renverrait l'enregistrement unique correspondant à l'un des cinq numéros de téléphone. Dans le cas où plusieurs enregistrements sont trouvés, le premier enregistrement créé doit être renvoyé. Ma seule préoccupation/problème est que lorsque cela passera en production, cela ne fonctionnera pas/il y aura un problème de performances car il y a 15 millions d'enregistrements de compte. Je peux probablement indexer les champs, mais cela aidera-t-il vraiment lorsque le nombre d'enregistrements est si élevé ? J'apprécierais vraiment toute suggestion/aide pour optimiser cette 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 : J'ai déjà demandé à l'équipe Biz si nous ne pouvions avoir qu'un seul champ de numéro de téléphone lors de la comparaison. Mais ils sont catégoriques avec cinq domaines.
Réponses
C'est plutôt le cas d'utilisation parfait pour SOSL. Tu peux faire:
FIND :phoneNumber
IN PHONE FIELDS
RETURNING Account(
Id
WHERE RecordType.Name='Person Account'
ORDER BY CreatedDate
LIMIT 1
)
Remarque : Si l'un de ces champs personnalisés est un champ de formule, cette approche manquera ces enregistrements, car les champs de formule ne sont pas indexés pour la recherche. Vous devez en fait copier les valeurs dans l'enregistrement recherché pour des raisons de performances.
Cette affirmation serait toujours vraie avec SOQL, soit dit en passant ; vous devez rendre la requête sélective, ce qui signifie ne pas utiliser de champs de formule. Tant que tous les champs filtrés sont indexés, votre requête d'origine ne devrait pas poser de problème, même à 15 millions d'enregistrements de volume de données.