Briefing de la Misión
El sistema de detección de fraudes ha identificado un patrón: Viajes que duran 0 minutos (Pickup = Dropoff) pero cobran tarifas altas (>$50).
El equipo de analítica intentó correr una consulta para auditarlos, pero colapsó el servidor de producción.
-- Intento Fallido (Duration: 45s, Reads: 3.5M)
SELECT * FROM Trips
WHERE DATEDIFF(MINUTE, Pickup, Dropoff) = 0
AND TotalAmount > 50;
Análisis Forense (Root Cause)
Por qué falló el índice.
El problema es la función DATEDIFF() en el WHERE.
Esto rompe la regla de SARGability (Search ARGument Ability). Al envolver las columnas en una función, el motor no puede mirar el índice y saltar a la fecha correcta. Tiene que calcular la resta para CADA UNA de las 3 millones de filas antes de saber si el resultado es 0.
Visualización del Problema
Ingeniería de Solución
Materializar el cálculo.
1. Columna Calculada Persistida
Creamos una columna virtual que almacena el resultado de DATEDIFF físicamente en el disco. El cálculo se hace UNA vez al insertar, no cada vez que consultas.
ALTER TABLE Trips
ADD DurationMinutes AS
DATEDIFF(MINUTE, Pickup, Dropoff)
PERSISTED; -- < La clave
2. Indexar lo Calculado
Ahora que el dato existe físicamente, podemos indexarlo. Ordenamos por duración para que todos los "0" queden juntos.
CREATE INDEX IX_Duration_Scam
ON Trips(DurationMinutes)
INCLUDE (TotalAmount);
Despliegue y Verificación
La consulta SARGable.
-- Consulta Optimizada
SELECT * FROM Trips
WHERE DurationMinutes = 0 -- Ahora busca en el índice
AND TotalAmount > 50;
Incidente Resuelto. Servidor Estable.
Volver al Centro de Mando