Loading

Mejorar el rendimiento de consultas SOQL empleando un índice personalizado

Fecha de publicación: Apr 6, 2021
Descripción

Las consultas SOQL deben ser selectivas, particularmente para consultas dentro de desencadenadores para obtener el mejor rendimiento. Para evitar tiempos de ejecución prolongados, las consultas SOQL no selectivas podrían ser interrumpidas por el sistema. Los desarrolladores recibirán un mensaje de error cuando una consulta no selectiva en un desencadenador se ejecute sobre un objeto que contiene más de 200.000 registros. Aprenda cómo puede evitar el error y haga que la consulta sea selectiva a continuación. 
Solución

Nota importante: 

Aunque se han empleado todos los esfuerzos para garantizar que este artículo explique cómo funciona el optimizador de consultas SOQL de Salesforce a un alto nivel, su comportamiento podría cambiar si aviso previo para acomodar mejoras de rendimiento adicionales. Se recomienda que los desarrolladores utilicen la vista Query Plan (Plan de consulta) (disponible desde Summer '14) en Developer Console, para poder activar consultas no selectivas en base a la información proporcionada por el optimizador en el momento en que se genera el plan de la consulta para la consulta SOQL afectada.

De manera adicional, los índices pueden incorporar coste al DML y/o en algunos casos el Optimizador de consultas tendrá que hacer cosas de manera diferente en base a los índices, lo que puede afectar al rendimiento.



Criterios de consultas SOQL selectivas


Una consulta es selectiva cuando uno de los filtros de la consulta está en un campo indexado y el filtro de la consulta reduce el número resultante de filas bajo un umbral definido por el sistema. El rendimiento de la consulta SOQL mejora cuando dos o más filtros empleados en la cláusula WHERE cumplen las condiciones mencionadas.

El umbral de selectividad es del 10% de los registros para el primer millón de registros y menos del 5% de los registros después del primer millón de registros, hasta un máximo de 333.000 registros. En algunas circunstancias, por ejemplo con un filtro de consulta que esté en un campo estándar indexado, el umbral podría ser superior. Del mismo modo, el umbral de selectividad está sujeto a cambios.



Consideraciones sobre índices personalizados para consultas SOQL selectivas

Los siguientes campos están indexados de forma predeterminada:
  • Claves principales (campos Id., Nombre y Propietario).
  • Claves externas (campos de búsqueda o de relaciones principal-detalle).
  • Fechas de auditoría (como SystemModStamp). 
  • Campos personalizados marcados como Id. externo o Exclusivo.
       

El Servicio de asistencia de Salesforce puede agregar índices personalizados bajo la solicitud de los clientes

Cuando cree un caso con el Servicio de asistencia, asegúrese de incluir la consulta SOQL que tenga el campo que haya que indexarse como un filtro en la cláusula WHERE. Asegúrese de incluir valores de vinculación, si los hubiera. 
Revise la lista de comprobación de Hacer selectiva una consulta SOQL antes de crear un caso de asistencia.
También puede determinar qué campos pueden indexarse tomando como referencia Cómo hacer mi consulta SOQL selectiva y realizando un análisis de Planificación de consultas en Developer Console como se menciona aquí: Herramienta Planificación de consultas
Los valores de campos de índice personalizado o casilla de verificación que se producen con menor frecuencia le pueden proporcionar el mayor beneficio para el rendimiento, y indican generalmente una consulta selectiva.  

No se puede crear un índice personalizado en estos tipos de campos:
  • Listas de selección múltiples.
  • Campos de divisa en una organización multidivisa.
  • Campos de texto largo. 
  • Campos binarios (campos de tipo blob, archivo o texto cifrado). 
Nota: Es posible agregar a Salesforce los nuevos tipos de datos, normalmente los complejos, y los campos de estos tipos pueden no permitir el indexado personalizado.
       

Normalmente, un índice personalizado no se utilizará en estos casos:
  • Los valores consultados superan el umbral definido por el sistema mencionado anteriormente.
  • El operador del filtro es un operador negativo como NOT EQUAL TO (o !=), NOT CONTAINS y NOT STARTS WITH.
  • El operador CONTAINS se utiliza en el filtro y el número de filas a explorar supera las 333.000. Esto se debe a que el operador CONTAINS requiere una exploración completa del índice. Tenga en cuenta que este el umbral está sujeto a cambios.
  • Cuando se compara con un valor vacío (Name != '').
Nota: Existen otros escenarios complejos en los que no se utilizarán índices personalizados. Póngase en contacto con su representante de Salesforce si su escenario no está cubierto por estos casos de uso o si necesita ayuda adicional con las consultas no selectivas.



Ejemplos de consultas SOQL selectivas

Para comprender mejor porqué una consulta sobre un objeto de grandes dimensiones es selectiva o no, analicemos algunas consultas. Para estas consultas, asumiremos que hay más de 200.000 registros (incluyendo registros con eliminación recuperable, o sea, registros eliminados que aún están en la Papelera) para el sObject Account.


Consulta 1:

SELECT Id FROM Account WHERE Id IN (<lista de identificadores de cuentas>)
La cláusula WHERE está en un campo indexado (Id). Si SELECT COUNT() FROM Account WHERE Id IN (<lista de identificadores de cuentas>) devuelve menos registros que el umbral de selectividad, se utiliza el índice en Id. Este será normalmente el caso, ya que la lista de identificadores solo contiene una pequeña cantidad de registros.


Consulta 2:

SELECT Id FROM Account WHERE Name != ''
Ya que Account es un objeto grande incluso aunque Name está indexado (clave principal), este filtro devuelve la mayoría de los registros, haciendo que la consulta sea no selectiva.
 

Consulta 3:

SELECT Id FROM Account WHERE Name != '' AND CustomField__c = 'ValueA'
Aquí tenemos que ver si cada filtro, cuando se consideran de forma individual, es selectivo. Como vimos en el ejemplo anterior el primer filtro no es selectivo. Así que centrémonos en el segundo. Si el recuento de registros devuelto por SELECT COUNT() FROM Account WHERE CustomField__c = 'ValueA' es inferior al umbral de selectividad CustomField__c está indexado, y la consulta es selectiva.

Consulta 4:

SELECT Id FROM Account WHERE FormulaField__c = 'ValueA'
La siguientes reglas tienen que ser verdaderas para indexar un campo de fórmula:
  • La fórmula contiene campos procedentes de un único objeto (sin campos de relación).
  • El campo de fórmula no hace referencia a funciones no deterministas (por ej. SYSDATE).
  • El campo de fórmula no hace referencia a ningún campo no admitido para su inclusión en índices. Esta lista no está documentada en ningún lugar específicamente (hay gran cantidad de casos especiales), pero en Spring 12(176), createdById no se admitía, pero Summer 12 (178) sí lo hacía. La situación es la misma para CreatedDate.
  • El campo de fórmula no contiene referencias a claves principales (por ej. Id). 
  • El campo de fórmula no utiliza la función TEXT(<campo de lista de selección>).
  • Si la fórmula hace referencia a cualquier campo de búsqueda, el campo debe tener la opción "Qué hacer si se elimina el registro de búsquedas" establecido en "Borrar el valor de este campo".

 

Nota: El rendimiento de la consulta SOQL será analizado por el Servicio de asistencia de Salesforce; si supera los criterios, entonces se realizará el índice.

Número del artículo de conocimiento

000385213

 
Cargando
Salesforce Help | Article