En este caso voy a utilizar únicamente 4 tablast_cita, t_estados_cita, t_punto_venta y t_viajero
.
t_cita
almacena las citas concertadas para una cierta fechat_estados_cita
almacena el estado en que se encuentra la cita: Creada, Bloqueada, Concertada, Anulada...t_punto_venta
almacena el establecimiento que va a atender la citat_viajero
almacena el usuario que ha concertado la cita
He generado la siguiente vista para consultar las citas concertadas y bloqueadas en el último mes:
`CREATE VIEW [dbo].[v_cita_estado_oficina]
AS
SELECT c.Id, p.Id AS Id_oficina, p.Denominacion, ec.Estado, c.Fecha, ec.razon, ec.Incidencias, NULL AS Documento, NULL AS Telefono, NULL AS Correo
FROM t_cita c, t_estados_cita ec, t_punto_venta p
WHERE c.Fecha > DATEADD(month, - 1, GETDATE()) AND c.Id = ec.Id_cita AND ec.Estado = 'Bloqueada' AND p.Id = c.Id_punto_venta AND ec.Id IN
(SELECT MAX(b.Id)
FROM t_cita a, t_estados_cita b
WHERE a.Id = b.Id_cita AND a.Fecha >= DATEADD(month, - 1, GETDATE())
GROUP BY a.Fecha, a.Id_punto_venta)
UNION
(SELECT c.Id, p.Id AS Id_oficina, p.Denominacion, ec.Estado, c.Fecha, ec.Razon, ec.Incidencias, v.Documento_personal, v.Telefono1, v.Correo_electronico
FROM t_cita c, t_estados_cita ec, t_punto_venta p, t_viajero v
WHERE c.Fecha > DATEADD(month, - 1, GETDATE()) AND c.Id = ec.Id_cita AND p.Id = c.Id_punto_venta AND c.Id_viajero IS NOT NULL AND c.Id_viajero = v.Id AND
c.Id NOT IN
(SELECT c.Id
FROM t_cita c, t_estados_cita ec
WHERE c.Id = ec.Id_cita AND c.Id_viajero IS NOT NULL AND c.Fecha >= DATEADD(month, - 1, GETDATE())
AND (ec.Estado = 'Cancelada')) AND ec.Id IN
(SELECT MAX(b.Id)
FROM t_cita a, t_estados_cita b
WHERE a.Id = b.Id_cita AND a.Fecha >= DATEADD(month, - 1, GETDATE())
GROUP BY a.Fecha, a.Id_punto_venta))
`
El caso es que al realizar una consulta para que me de las citas de un punto de venta de los antiguos, por ejemplo:
select * from v_cita_estado_oficina where Id_oficina = 11 and Estado = 'Concertada'
lo hace rapidísimo, no tarda apenas unos segundos. Pero cuando hago la misma consulta para un punto de venta nueva por ejemplo:
select * from v_cita_estado_oficina where Id_oficina = 32 and Estado = 'Concertada'
La consulta llega a tardar hasta 2minutos y 30 segundos, lo cual es inviable.
He analizado los Planes de ejecución para ambas consultas y son diferentes. En la segunda consulta hay un Sort
que consume hasta el 70% del tiempo. Espero que alguien me pueda ayudar a optimizar esta consulta. Un saludo y gracias.