🔥 Cómo optimizar una query en SFMC me ahorró el 60% del tiempo (de verdad)

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ónTiempo de ejecuciónRegistros devueltos
❌ No SARGable1:10758,508
✅ SARGable0:28758,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.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top