¿Cómo optimizar la consulta SOQL cuando tengo 15 millones de registros de cuenta?

Aug 15 2020

Tengo un caso de uso en el que expongo un servicio Rest personalizado que aceptaría el número de teléfono como argumento y lo compararía con los cinco campos de número de teléfono en Cuenta y devolvería el registro único que coincide con cualquiera de los cinco números de teléfono. En caso de que se encuentren varios registros, se debe devolver el registro creado más antiguo. Mi única preocupación/problema es que cuando esto entre en producción, no funcionará/habrá un problema de rendimiento ya que hay 15 millones de registros de cuenta. Probablemente pueda indexar los campos, pero ¿eso realmente ayudará cuando el número de registros sea tan alto? Realmente agradecería cualquier sugerencia/ayuda para optimizar 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];

PD: Ya le pregunté al equipo de Biz si podemos tener solo un campo de número de teléfono durante la comparación. Pero son inflexibles con cinco campos.

Respuestas

3 sfdcfox Aug 15 2020 at 19:51

En cambio, este es el caso de uso perfecto para SOSL. Tu puedes hacer:

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

Nota: Si alguno de esos campos personalizados son campos de fórmula, este enfoque perderá esos registros, ya que los campos de fórmula no se indexan en la búsqueda. En realidad, debe copiar los valores en el registro que se busca por motivos de rendimiento.

Esta afirmación seguiría siendo cierta con SOQL, por cierto; debe hacer que la consulta sea selectiva, lo que significa no usar campos de fórmula. Siempre que todos los campos filtrados estén indexados, su consulta original no debería ser un problema, incluso con 15 millones de registros de volumen de datos.