Loading

Codificar con mayor eficiencia para evitar "Se supera 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, se cerrarán como una transacción de larga ejecución.
Solución

Solo contamos eventos que requieren uso de CPU del servidor de aplicaciones. Hay algunas cosas que utilizan la CPU del servidor de aplicaciones que no contamos. Las cosas más allá de su control como programador no se incluyen. Por ejemplo, el tiempo empleado en la recuperación de registros de la base de datos no cuenta. El tiempo empleado en esperar el retorno de una llamada tampoco se incluye. Usted no controla el momento en que su código necesita compilarse, de modo que ese tiempo no se cuenta.
 

Contaremos casi cualquier otra cosa 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 produzcan en una transacción de Apex: para ejecutar el código de Apex y cualquier proceso que se llame desde este código, como el código del paquete 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 de Apex
  • Las funciones de biblioteca expuestas de Apex
  • La ejecución de flujos de trabajo

Qué no se cuenta

  • Operaciones de la base de datos, como por ejemplo la parte del tiempo de ejecución empleado en la base de datos para DML, SOQL y SOSL no se cuenta, ni tampoco el tiempo de espera para llamadas de Apex, SOQL.

Prácticas recomendadas para reducir el tiempo de espera de CPU

Puede consultar las prácticas recomendadas de código de Apex  que le ayudarán a reducir el tiempo de espera de CPU. Pasaremos por algunas sugerencias a continuación. 

Uso de una 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 garantizado debido a bucles de setIds.add(a.id); } //El uso de una consulta Map ahorra tiempo de CPU //Obtención de todas las cuentas en el mapa Map<id,account> aMap = new Map<id,account>([Select Id,Name from Account limit 50000]); //Creación de lista de cuentas List<account> accList = aMap.values() ; //Creación de u conjunto de Ids Set<id> accIds = aMap.keySet() ;

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

En algunos casos los procesos comerciales pueden no realizarse en tiempo real. Si hay una oportunidad de hacer que el código se ejecute más tarde, se interrumpirá el contexto y también el límite de tiempo de espera de CPU para procesos asíncronos, que es de 60 segundos (6X de procesos síncronos). Tenga en cuenta esto si está a punto de alcanzar el límite.

Uso de SOQL agregado

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

Digamos que desea una suma del valor de campo de algunos registros. Si utiliza un bucle for normal para obtenerla, es obvio que tiene que emplear tiempo de CPU. En su lugar, intente distribuir su cálculo empleando las funciones de agregación SUM,AVG en la capa de la base de datos en sí. Al hacer esto reducirá el tiempo de CPU y distribuirá el proceso en la capa de la base de datos en sí. Explore opciones para agrupar o crear algún tipo de filtrado en la capa de la base de datos. Distribuya sus cálculos en la capa de la base de datos para reducir la posibilidad de que se presente un problema de tiempo de espera de CPU.

Utilizar únicamente los datos necesarios para ejecutar un bucle

Es esencial filtrar solo por datos específicos al utilizar for en una lista de registros Demasiados bucles aumentarán el tiempo de CPU. Esto es igual cuando se tenía un límite de instrucciones de secuencias de comandos.

Nota: En estos momentos hay un problema conocido con operaciones de inserción DML que imponen CPU de Apex cuando está en un número elevado de registros que tienen demasiadas columnas. 

Número del artículo de conocimiento

000387833

 
Cargando
Salesforce Help | Article