Optimizar performance en Microsoft Dynamics 365 Business Central SaaS no es una tarea opcional en entornos empresariales: es una necesidad crítica. A medida que los sistemas crecen en volumen de datos, número de usuarios e integraciones, cualquier ineficiencia en el código AL o en el diseño funcional se amplifica.
A diferencia de sistemas on-premise, en SaaS no se tiene control sobre la infraestructura. No se puede “escalar hardware”, ni ajustar SQL directamente. Todo debe resolverse a nivel de:
- diseño de datos
- patrones de acceso
- lógica AL
- arquitectura de procesos
Por eso, la optimización en Business Central no es un tema de tuning puntual, sino de diseño desde el inicio.
El problema Link to heading
Los problemas de performance en BC suelen aparecer tarde:
- lentitud en páginas
- procesos batch que no terminan
- bloqueos en posting
- timeouts en integraciones
Y casi siempre tienen las mismas causas:
1. Acceso ineficiente a datos Link to heading
- loops sobre grandes tablas
- falta de filtros adecuados
- uso incorrecto de FindSet / FindFirst
2. Uso incorrecto de triggers Link to heading
- lógica pesada en OnValidate
- cálculos en OnAfterGetRecord
- dependencia excesiva de eventos
3. Transacciones largas Link to heading
- múltiples operaciones dentro de una sola transacción
- locks prolongados
4. Falta de batch processing Link to heading
- procesamiento registro por registro sin control
Principios de optimización Link to heading
1. Minimizar roundtrips a base de datos Link to heading
Cada acceso a datos cuesta. Evitar:
- llamadas dentro de loops
- búsquedas repetidas
Preferir:
if Rec.FindSet() then
repeat
// procesar en memoria
until Rec.Next() = 0;
2. Usar FindSet correctamente Link to heading
Rec.FindSet(true, false);
- true → lock optimista
- false → evita carga innecesaria
3. Filtrar siempre antes de leer Link to heading
Rec.SetRange("Customer No.", CustNo);
Rec.FindSet();
Nunca recorrer tablas completas sin necesidad.
4. Evitar lógica pesada en UI Link to heading
No ejecutar:
- cálculos complejos en páginas
- integraciones en triggers
Mover a:
- background processing
- Job Queue
5. Batch processing Link to heading
Procesar en bloques:
- reduce locks
- mejora resiliencia
6. Reducir tamaño de transacciones Link to heading
Separar procesos grandes:
Commit();
Usar con cuidado, pero necesario en procesos largos.
Patrones avanzados Link to heading
1. Caching lógico Link to heading
Guardar resultados en memoria temporal:
TempRec.Insert();
Evita recalcular.
2. Staging tables Link to heading
Procesar fuera del flujo principal:
- staging → validación → commit
3. Paralelismo controlado Link to heading
Usar múltiples Job Queues:
- separar cargas
- evitar cuellos de botella
Anti-patterns críticos Link to heading
❌ loops sobre tablas completas
❌ lógica en triggers
❌ integraciones síncronas en procesos críticos
❌ transacciones gigantes
❌ falta de filtros
Trade-offs Link to heading
Optimizar vs complejidad Link to heading
Más performance implica:
- más arquitectura
- más código
- más control
Pero es necesario en sistemas reales.
Buenas prácticas Link to heading
- medir antes de optimizar
- usar telemetry (Application Insights)
- probar con datos reales
- diseñar pensando en volumen
Conclusiones Link to heading
La optimización de performance en Business Central no es un ajuste final, sino un principio de diseño.
Los sistemas que no consideran performance desde el inicio:
- se degradan rápidamente
- generan problemas operativos
- se vuelven difíciles de mantener
Un enfoque basado en:
- acceso eficiente a datos
- batch processing
- separación de responsabilidades
permite construir soluciones escalables y robustas.