En Salesforce Marketing Cloud, a veces una función mal colocada puede costarte segundos valiosos en cada ejecución. Y cuando hablamos de automations que corren todos los días… eso se multiplica.
Hoy te muestro cómo una simple refactorización nos hizo pasar de 1:10 minutos a solo 28 segundos, sin perder ni un solo registro. 🧪
🎯 El caso de uso
Queríamos identificar usuarios cuya última actividad de email (open o click) ocurrió hace más de 13 meses, siempre y cuando tuvieran un permiso de email activo (email_perm_status = ‘Y’).
❌ Versión original (no SARGable)
SELECT field
FROM [Customer_Master]
WHERE
(
DATEDIFF(d, last_em_open_dt, GETDATE()) > 395
OR
DATEDIFF(d, last_em_click_dt, GETDATE()) > 395
)
AND email_perm_status = 'Y'
El problema: el uso de DATEDIFF() sobre columnas en el WHERE obliga al motor a calcular esa función fila por fila.
Y en un data set con cientos de miles de registros… eso se siente. 🐢
✅ Versión optimizada (SARGable)
SELECT field
FROM [Customer_Master]
CROSS JOIN (
SELECT CAST(DATEADD(day, -395, GETDATE()) AS DATE) AS cutoff_date
) d
WHERE
(
last_em_open_dt < d.cutoff_date
OR
last_em_click_dt < d.cutoff_date
)
AND email_perm_status = 'Y'
💡 Lo que hicimos:
- Calculamos la fecha de corte solo una vez.
- Usamos comparación directa con las columnas (que es mucho más eficiente).
- Conservamos la lógica original al 100%.
📊 Comparación de rendimiento
Versión | Tiempo de ejecución | Registros devueltos |
---|---|---|
❌ No SARGable | 1:10 | 758,508 |
✅ SARGable | 0:28 | 758,508 |
🧠 ¿Por qué usar 395 días y no
DATEADD(month, -13, GETDATE())?
Buena pregunta.
Usar 395 días es una forma bruta pero efectiva de garantizar que estás cubriendo al menos 13 meses, sin importar:
- Si hay meses de 28, 30 o 31 días
- Si caes en un año bisiesto
- Si la fecha cae a final de mes y el motor ajusta automáticamente (como hace DATEADD(month, -13, …))
Si quieres más precisión calendario → usa DATEADD(month, -13, GETDATE())
Si quieres más seguridad de cobertura → usa DATEADD(day, -395, GETDATE())
💡 Conclusiones
- Evita funciones como DATEDIFF() o DATEPART() directamente sobre columnas en el WHERE.
- Precalcula fechas con CROSS JOIN si es solo un valor que necesitas propagar.
- Mide antes y después. A veces el ahorro es de segundos… a veces, de horas.