Como otimizar a consulta SOQL quando tenho 15 milhões de registros de conta?

Aug 15 2020

Tenho um caso de uso em que estou expondo um serviço Rest personalizado que aceitaria o número do telefone como um argumento e compararia com os cinco campos do número do telefone em Conta e retornaria o único registro correspondente a qualquer um dos cinco números do telefone. Caso sejam encontrados vários registros, o registro criado mais cedo deve ser retornado. Minha única preocupação/problema é quando isso for para produção, não funcionará/haverá um problema de desempenho, pois existem 15 milhões de registros de conta. Provavelmente posso indexar os campos, mas isso realmente ajudará quando a contagem de registros for tão alta? Eu realmente apreciaria qualquer sugestão/ajuda para otimizar este 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á perguntei à equipe de Biz se podemos ter apenas um campo phone# durante a comparação. Mas eles são inflexíveis com cinco campos.

Respostas

3 sfdcfox Aug 15 2020 at 19:51

Este é o caso de uso perfeito para SOSL. Você pode fazer:

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

Observação: se algum desses campos personalizados for um campo de fórmula, essa abordagem perderá esses registros, pois os campos de fórmula não são indexados por pesquisa. Você precisa realmente copiar os valores para o registro que está sendo pesquisado por motivos de desempenho.

A propósito, essa afirmação ainda seria verdadeira com SOQL; você precisa fazer a consulta seletiva, o que significa não usar campos de fórmula. Desde que todos os campos filtrados sejam indexados, sua consulta original não deve ser um problema, mesmo com 15 milhões de registros de volume de dados.