Loading

Codificar con más eficiencia para evitar "Se superó el límite de tiempo de CPU de Apex"

Fecha de publicación: Aug 19, 2020
Descripción
Salesforce tiene un límite de tiempo de espera para transacciones basadas en el uso de la CPU. Si las transacciones consumen demasiado tiempo de CPU, las cerraremos como una transacción de la ejecución larga.
Solución

Solo contamos eventos que requieren uso de la CPU del servidor de aplicaciones. Hay algunas cosas que utilizan tiempo de CPU del servidor de aplicaciones que no contamos, porque están fuera de su control como programador. Por ejemplo, el tiempo empleado en la base de datos recuperando registros no cuenta, ni el tiempo empleado en esperar el regreso de una llamada. Usted no controla el momento en que su código necesita compilación, así que no contamos eso.
 

Contaremos casi todo lo demás que ocurra en el servidor de aplicaciones, incluyendo las acciones declarativas. Si DML en su código encuentra una regla de validación con una fórmula, contaremos el tiempo empleado en evaluar esa fórmula. El tiempo de CPU se calcula para todas las ejecuciones en los servidores de aplicaciones de Salesforce que se producen en una transacción de Apex: para la ejecución del código Apex, y cualquier proceso al que se llame desde este código, como el código de paquetes y los flujos de trabajo. El tiempo de CPU es privado para una transacción y se aísla de otras transacciones. Las operaciones que no consumen tiempo de CPU del servidor de aplicaciones no se cuentan en el tiempo de CPU.
 

Qué se cuenta

  • Todo el código Apex
  • Funciones de bibliotecas expuestas en Apex
  • Ejecución de flujos de trabajo

Qué no se cuenta

  • Operaciones de la base de datos, por ej. DML, SOQL
  • SOSL
  • Llamadas HTTP

 

Mejores prácticas para reducir el tiempo de espera de CPU

Ahora pasemos por algunas de las mejores prácticas en el código para ayudar a reducir el tiempo de espera de CPU.

Utilizar consulta basada en Map

List<Account> lstacc=[Select Id from Account limit 10000]; Set<Id> setIds=new Set<Id>(); for(Account a:lstacc){ //Más tiempo de CPU debido al bucle setIds.add(a.id); } //Emplear la consulta Map ahorra tiempo de CPU //Obteniendo todas las cuentas en la asignación Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]); //Creando lista de cuentas List<account> accList = aMap.values() ; //Creando conjunto de ids Set<id> accIds = aMap.keySet() ;

Explore si su negocio le permite realizar la operación de forma asíncrona

En algunos casos los procesos de negocio pueden no ser en tiempo real y por ello si hay una oportunidad de que el código se ejecute en @future; esto interrumpirá el contexto y también el límite de tiempo de espera de CPU para procesos asíncronos en 60 segundos (6 veces el proceso síncrono). De este modo, considere esto si tiene problemas alcanzando el límite.

Uso de SOQL agregado

Ya que el tiempo de la base de datos no se calcula en el tiempo de CPU, siempre es mejor explorar el uso de SOQL agregado para su caso de uso de negocio.

Digamos que desea la suma del valor de los campos de algunos registros; si utiliza un bucle normal para obtenerla obviamente gastó ahí tiempo de CPU. En su lugar intente realizar su cálculo utilizando las funciones agregadas SUM,AVG en la capa de la base de datos en sí de modo que reduzca el tiempo de CPU realizando el proceso en la capa de la base de datos. Explore opciones para agrupar o crear algún tipo de filtrado en la capa de la base de datos y realice sus cálculos ahí para reducir los posibilidades de tener el problema de alcanzar el límite de tiempo de CPU.

Tome únicamente los datos necesarios y ejecute un bucle

Ahora es esencial filtrar únicamente los datos específicos realizando una lista de los registros, ya que demasiados bucles aumentarán el tiempo de CPU. Lo mismo se aplica con el límite de declaraciones de secuencias de comandos.

Número del artículo de conocimiento

000387833

 
Cargando
Salesforce Help | Article