Ejemplo de procesamiento de registros masivo para evitar límites de CPU
Aprenda cómo refactorizar flujos para utilizar patrones de masificación que evitan errores Apex_CPU_TIME_LIMIT_EXCEEDED. Este ejemplo demuestra la diferencia entre el diseño de flujo ineficiente y optimizado.
Ediciones necesarias
| Ver ediciones compatibles. |
| Permisos de usuario necesarios | |
|---|---|
| Para abrir, modificar, crear, activar o desactivar un flujo utilizando todos los tipos de flujo, elementos y funciones disponibles en Flow Builder, incluyendo Einstein y Agentforce for Flow: | Gestionar flujo |
Este ejemplo muestra cómo transformar un flujo que realiza Lenguaje de manipulación de datos (DML) dentro de un bucle en un flujo masivo que procesa registros de forma eficiente. Vea una comparación de antes y después y aprenda los principios de masificación de flujos.
Escenario
Cree un flujo desencadenado por registro que se ejecute cuando se cierre una oportunidad. Para cada oportunidad cerrada ganada, el flujo crea una tarea de seguimiento para cada miembro del equipo de oportunidades. El flujo:
- Obtiene todos los miembros del equipo de oportunidades.
- Crea una tarea asignada a cada miembro del equipo.
- Funciona de forma eficiente incluso cuando los usuarios actualizan múltiples oportunidades a la vez.
- Evita errores Apex_CPU_TIME_LIMIT_EXCEEDED durante operaciones masivas.
Salesforce aplica un límite de tiempo de CPU único de 10.000 milisegundos (10 segundos) por transacción síncrona. Cada parte de la automatización en esa transacción (desencadenadores Apex, flujos, reglas de flujo de trabajo y procesos) proviene del mismo presupuesto. Un diseño de flujo ineficiente agrava el problema. Otras automatizaciones en la transacción reducen el presupuesto compartido primero, y un flujo ineficiente consume más de lo necesario de lo que queda.
El orden en el que se ejecutan los flujos depende del tipo de flujo. Este ejemplo utiliza un flujo desencadenado por registro después de guardar, que se ejecuta más tarde en el orden que antes de guardar flujos. Para obtener detalles sobre el orden de ejecución, consulte Desencadenadores y Orden de ejecución.
Enfoque ineficiente: Operaciones DML dentro de un bucle
Este enfoque provoca errores de límite de CPU al procesar múltiples oportunidades.
Estructura de flujo: El flujo comienza con un Flujo desencadenado por registro en el objeto Oportunidad que se ejecuta después de una actualización de registro cuando Etapa es igual a "Cerrada ganada". El flujo utiliza Obtener registros para obtener miembros del equipo de oportunidades para el registro que desencadena, luego pasa por la recopilación. Dentro del bucle, un elemento Crear registros crea una tarea para cada miembro del equipo.
Por qué falla este enfoque:
- Cada iteración de bucle realiza una operación DML separada.
- Una oportunidad con 5 miembros del equipo da como resultado 5 operaciones DML.
- Cuando los usuarios actualizan 20 oportunidades a la vez, el flujo procesa todas las oportunidades en una transacción.
- 20 oportunidades × 5 miembros del equipo cada una = 100 operaciones DML en una transacción.
- El tiempo acumulado de CPU desde 100 operaciones DML supera el límite regulador.
- Resultado: Error Apex_CPU_TIME_LIMIT_EXCEEDED.
Enfoque eficiente: Masificación basada en recopilación
Este enfoque procesa registros de forma eficiente independientemente del volumen.
Estructura de flujo: El flujo comienza con un flujo desencadenado por registro en el objeto Oportunidad y utiliza Obtener registros para obtener miembros del equipo de oportunidades. El flujo crea una variable de registro Tarea y una variable de colección de registros Tarea. La variable de registro alberga la tarea actual en la que está trabajando el flujo y la recopilación de registros alberga las tareas que se van a crear. El flujo atraviesa los miembros del equipo. Dentro del bucle, un elemento Asignación construye cada registro de tarea estableciendo valores para la variable de registro Tarea y relaciona la tarea con el miembro del equipo actual en el bucle. Otro elemento Asignación agrega los valores de variable de registro Tarea a la recopilación de registros Tarea. Tras completar el bucle, un único elemento Crear registros crea todas las tareas desde la recopilación.
Por qué funciona esto:
- El bucle crea una recopilación de registros de tareas sin realizar operaciones DML.
- Solo se produce una operación DML después de completar el bucle.
- Una oportunidad con 5 miembros del equipo aún da como resultado solo 1 operación DML (creando 5 tareas a la vez).
- Cuando los usuarios actualizan 20 oportunidades a la vez, el flujo realiza 20 operaciones DML en total (una por oportunidad).
- Reducción significativa del consumo de tiempo de CPU.
- Resultado: El flujo se completa correctamente sin alcanzar los límites reguladores.
Comparación de rendimiento
| Escenario | Ineficiente (DML en bucle) | Eficiente (masificado) |
|---|---|---|
| 1 oportunidad con 5 miembros del equipo | 5 operaciones DML | 1 operación DML |
| 20 oportunidades (actualización masiva) con 5 miembros del equipo cada una | 100 operaciones DML (Posiblemente falle con el error de límite de CPU) |
20 operaciones DML (Se completa correctamente) |
| 100 oportunidades (carga de datos) con 3 miembros de equipo cada una | 300 operaciones DML (Definitivamente falla) |
100 operaciones DML (Se completa correctamente) |
Principios clave de masificación
- Nunca realice operaciones DML dentro de bucles. Recopile siempre registros en una variable de recopilación durante el bucle, luego realice DML después de que se complete el bucle.
- Diseño para operaciones masivas desde el principio. Supongamos que los flujos desencadenados por registros procesan múltiples registros de forma simultánea.
- Utilice variables de colección de registros. Las operaciones DML basadas en recopilación son dramáticamente más eficientes que las operaciones individuales.
- Pruebe con volúmenes realistas. El modo de depuración con un registro no revela problemas de operación masiva. Pruebe con el Asistente de importación de datos, el Cargador de datos o actualizaciones masivas.
- Supervise el rendimiento. Revise los registros de depuración para identificar flujos que se acercan a los límites reguladores antes de que fallen en producción.
Pasos de alto nivel
Revise los pasos de este ejemplo. Sígalos en orden o vaya a una sección para obtener instrucciones más específicas.
- Creación del flujo
Configure el flujo desencadenado por registro para que se ejecute cuando se cierren las oportunidades. - Crear recursos
Cree las variables necesarias para el procesamiento masivo. - Obtener miembros del equipo
Obtenga los registros de Miembro del equipo de oportunidades para su procesamiento utilizando un elemento Obtener registros. - Agregar una decisión para comprobar miembros del equipo
Agregue un elemento Decisión para evitar el procesamiento cuando no hay miembros del equipo. - Agregar un elemento de bucle
Agregue un elemento Bucle para iterar por los miembros del equipo. - Crear registros de tareas dentro del bucle
Rellene valores de campo para la variable de registro TaskRecord para cada miembro del equipo dentro del bucle. - Agregar tareas a la recopilación
Agregue cada registro de tarea a la variable de colección TasksToCreate para la creación masiva. - Crear todas las tareas después del bucle
Utilice un único elemento Crear registros para crear todas las tareas en una sola operación. - Agregar tratamiento de errores
Configure la gestión de fallos para capturar y reportar errores. - Probar con datos masivos
La prueba de flujos masivos requiere simular operaciones masivas. - Más técnicas de optimización
Optimice aún más los flujos masivos con estas técnicas. - Convertir flujos existentes
Convierta flujos con operaciones de Lenguaje de manipulación de datos (DML) en bucles en patrones masivos.
Creación del flujo
Configure el flujo desencadenado por registro para que se ejecute cuando se cierren las oportunidades.
-
Abra la vista de lista Flujos.
- En Configuración, en el cuadro Búsqueda rápida, introduzca Flujos y, a continuación, seleccione Flujos.
- Desde la aplicación Automatización, seleccione la ficha Flujos.
- Desde la ficha Flujos en cualquier aplicación Lightning, haga clic en el menú de acciones y seleccione Abrir flujo.
-
Cree un flujo desencadenado por registro.
- Desde la aplicación Automation Lightning, haga clic en Nuevo. Busque y seleccione Flujo desencadenado por registro.
- Desde Configuración, haga clic en Nuevo flujo, busque y seleccione Flujo desencadenado por registro.
Se abre el panel Configurar inicio. -
Configure el elemento Inicio.
- En Objeto, seleccione Oportunidad.
- Para Desencadenar el flujo cuando, seleccione Se actualiza un registro.
- En la sección Establecer condiciones de entrada, Para requisitos de condición, seleccione Se cumplen todas las condiciones (AND).
- En Campo, seleccione Etapa.
- En Operador, seleccione Es igual a.
- Para Valor, seleccione Cerrada ganada.
- En Optimizar flujo, seleccione Acciones y registros relacionados.
Crear recursos
Cree las variables necesarias para el procesamiento masivo.
-
Para crear cada tarea, cree una variable de registro para crear registros de tareas.
-
Para abrir la Caja de herramientas, haga clic en
.
- Haga clic en Nuevo recurso y luego seleccione Variable.
- Para Nombre de API, introduzca TaskRecord.
- En Tipo de datos, seleccione Registro.
- En Objeto, seleccione Tarea.
- Haga clic en Listo.
-
Para abrir la Caja de herramientas, haga clic en
-
Para almacenar todas las tareas, cree una variable de colección de registros para todas las tareas.
- Haga clic en Nuevo recurso y luego seleccione Variable.
- Para Nombre de API, introduzca TasksToCreate.
- En Tipo de datos, seleccione Registro.
- En Objeto, seleccione Tarea.
- Seleccione Permitir varios valores (recopilación).
- Haga clic en Listo.
Obtener miembros del equipo
Obtenga los registros de Miembro del equipo de oportunidades para su procesamiento utilizando un elemento Obtener registros.
-
Haga clic en
y luego busque y seleccione Obtener registros.
-
Configure el elemento.
- En Etiqueta, introduzca Obtener miembros del equipo de oportunidades.
-
En Objeto, seleccione Función de contacto de oportunidad.
En este ejemplo, el flujo almacena miembros del equipo en el objeto Función de contacto de oportunidad. Un objeto que vincula oportunidades a contactos.
- En la sección Filtrar registros de funciones de contacto de oportunidad, en Campo, seleccione Id. de oportunidad.
- En Operador, seleccione Es igual a.
- Para Valor, seleccione Desencadenar oportunidad y luego Id. de oportunidad.
- Para la opción Cuántos registros almacenar, seleccione Todos los registros.
- En Cómo almacenar datos de registros, seleccione Almacenar automáticamente todos los campos.
Agregar una decisión para comprobar miembros del equipo
Agregue un elemento Decisión para evitar el procesamiento cuando no hay miembros del equipo.
-
Haga clic en
y luego busque y seleccione Decisión.
-
Configure la decisión.
- Para Etiqueta, introduzca Miembros del equipo.
- El nombre de API se rellena automáticamente.
- Para Etiqueta de resultado, introduzca Sí.
- El nombre de API se rellena automáticamente.
- Para Recurso, seleccione Funciones de contacto de oportunidad desde Obtener miembros de equipo de oportunidad.
- En Operador, seleccione Es nulo.
- Para Valor, seleccione Falso.
- Haga clic en Resultado predeterminado.
- Para Etiqueta, introduzca No.
Agregar un elemento de bucle
Agregue un elemento Bucle para iterar por los miembros del equipo.
-
En la ruta Sí, haga clic en
y luego busque y seleccione Bucle.
-
Configure el bucle.
- Para Etiqueta, introduzca Iterar a través miembros del equipo.
- El nombre de API se rellena automáticamente.
-
Para Variable de recopilación, seleccione Función de contacto de oportunidad desde Obtener miembros del equipo de oportunidades.
Este recurso se muestra como singular, incluso si contiene múltiples registros.
- En Dirección, seleccione Primer elemento a último.
Crear registros de tareas dentro del bucle
Rellene valores de campo para la variable de registro TaskRecord para cada miembro del equipo dentro del bucle.
-
Después de Para cada uno, haga clic en
y luego busque y seleccione Asignación.
-
Configure la asignación.
- Para Etiqueta, introduzca Crear registro de tarea.
- El nombre de API se rellena automáticamente.
- Para Variable, seleccione TaskRecord y luego seleccione Asunto.
- En Operador, seleccione Es igual a.
- Para obtener valor, introduzca Seguimiento de oportunidad cerrada.
- Haga clic en + Agregar asignación.
-
Siga agregando asignaciones y estableciendo valores.
Recurso Operador Valor TaskRecord > Estado Igual No iniciado TaskRecord > Priority Igual Alto TaskRecord>Id. asignado a Igual Elemento actual desde Bucle>Id. de contacto TaskRecord>Relacionado con Id. Igual Desencadenamiento de oportunidad>Id. de oportunidad
Agregar tareas a la recopilación
Agregue cada registro de tarea a la variable de colección TasksToCreate para la creación masiva.
-
Después del elemento Asignación, y aún en el bucle, haga clic en
y luego busque y seleccione Asignación.
-
Configure la asignación.
- Para Etiqueta, introduzca Agregar tarea a recopilación.
- Para Variable, seleccione TasksToCreate.
- En Operador, seleccione Agregar.
- Para Valor, seleccione TaskRecord y luego Recurso completo.
Crear todas las tareas después del bucle
Utilice un único elemento Crear registros para crear todas las tareas en una sola operación.
-
Tras finalizar el bucle, haga clic en
y, a continuación, busque y seleccione Crear registros.
-
Configure el elemento.
- En Etiqueta, introduzca Crear todas las tareas.
- En Cómo establecer valores de campo de registro, seleccione Desde una variable de registro.
- Para Cuántos registros crear, seleccione Múltiples.
- Para Recopilación de registros, seleccione TasksToCreate.
- Guarde el flujo.
- En Etiqueta, introduzca Crear tareas para miembros del equipo de oportunidades.
- El nombre de API se rellena automáticamente.
Agregar tratamiento de errores
Configure la gestión de fallos para capturar y reportar errores.
-
Para gestionar errores, agregue una ruta de fallo al elemento Crear registros.
- Haga clic en los tres puntos del elemento Crear todas las tareas y seleccione Agregar ruta de fallo.
-
Para notificar a los administradores de Salesforce de fallos en la ruta de fallo, agregue una acción Enviar correo electrónico.
-
En la ruta del fallo, haga clic en
y luego busque y seleccione Enviar correo electrónico.
- Para Etiqueta, introduzca Notificar al administrador sobre error.
- El nombre de API se rellena automáticamente.
- Para Direcciones de destinatario, introduzca la dirección de correo electrónico de la persona a la que desea enviar la notificación.
- En Asunto, introduzca Un flujo necesita su atención
- Para Cuerpo, introduzca El flujo Crear tareas para miembros del equipo de oportunidades tuvo un error. Este es el error: .
- Haga clic en Insertar un recurso.
- Seleccione Flujo en ejecución y luego seleccione Mensaje de fallo.
-
En la ruta del fallo, haga clic en
- Guarde su trabajo.
Probar con datos masivos
La prueba de flujos masivos requiere simular operaciones masivas.
- Para probar un registro individual, utilice el modo Depuración para actualizar una oportunidad y verificar que el flujo crea tareas correctamente.
- Active el flujo.
-
Para probar operaciones masivas en un entorno sandbox, utilice el Asistente de importación de datos, el Cargador de datos o una vista de lista para actualizar múltiples oportunidades a la vez.
- Cree entre 10 y 20 oportunidades de prueba.
- Agregue miembros del equipo a cada oportunidad.
- Utilice el Cargador de datos o la actualización masiva para cambiar la etapa a "Cerrada ganada" en todas las oportunidades de forma simultánea.
- Verifique que el flujo crea todas las tareas sin errores.
- Para verificar el rendimiento, revise el registro de depuración de Apex para confirmar que el consumo de tiempo de CPU está dentro de los límites aceptables.
Más técnicas de optimización
Optimice aún más los flujos masivos con estas técnicas.
Utilizar condiciones de entrada para limitar la ejecución
Agregue condiciones al elemento Inicio de flujo para asegurarse de que se ejecuta solo cuando es necesario. Por ejemplo, procese solo oportunidades por encima de un importe determinado o desde tipos de registro específicos.
Tener en cuenta después del guardado para operaciones no críticas
Los flujos desencadenados por registros después de guardar pueden crear tareas de seguimiento después de guardar la oportunidad. Se ejecutan de forma asíncrona y tienen límites reguladores más altos.
Proceso por lotes para volúmenes muy grandes
Si las oportunidades tienen regularmente docenas de miembros del equipo, utilice un flujo programado que procese oportunidades cerradas en lotes en vez de en tiempo real.
Convertir flujos existentes
Convierta flujos con operaciones de Lenguaje de manipulación de datos (DML) en bucles en patrones masivos.
Si tiene flujos existentes con operaciones DML en bucles, siga estos pasos para convertirlos.
- Para buscar operaciones DML en bucles, identifique todos los elementos Crear registros, Actualizar registros y Eliminar registros en bucles.
-
Para cada elemento DML, realice la conversión.
- Para crear registros, cree una variable de registro para ese tipo de objeto.
- Para almacenar los registros que desea procesar, cree una variable de colección de registros para ese tipo de objeto.
- Para guardar valores de campo para los registros, utilice un elemento Asignación para asignar valores a la variable de registro.
- Para recopilar los registros para procesar, utilice una Asignación para agregar la variable de registro a la recopilación de registros.
- Para crear registros de forma eficiente, después del bucle, agregue un elemento DML que procese toda la recopilación de registros.
- Para verificar la conversión, pruebe minuciosamente con datos masivos para verificar que la refactorización funcionó correctamente.

