Buenos dias tengo un Store Procedure que arma un resumen de cuentas de proveedores calculando Debe, Haber y Saldo. El problema es que cuando existen muchos registros de un proveedor esta consulta tarda 10 a 20seg en responder o a veces mas. Lo que hace la consulta es ir calculando el saldo restando el total de haber - total de debe en cada registro.
Código SQL
[-]
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, S.fecha)) as Fecha, S.percIIBB, S.PercGcias,
S.idMovimiento, ISNULL(S.idMovCampo, 0) as idMovCampo, S.importe, S.Neto, S.idOP,
S.Empresa, S.idProveedor, S.NroComprobante, S.idTipoMov, S.idOrigenPago, S.idEmpresa,
S.Tipo, S.TipoLetra, S.NroLote, S.NroFact, S.Detalle, S.Vehiculo, S.Debe, S.Haber,
((SELECT (F.Facturas - P.pagos - CASE WHEN ch.Saldo is NULL THEN 0 ELSE ch.Saldo END) as SAldo FROM
(SELECT (CASE WHEN SUM(Importe) IS NULL THEN 0 ELSE SUM(Importe) END) as Facturas FROM Movimientos
WHERE
idProveedor = @paramidProveedor
AND
idTipoMov = 1
AND
idMovimiento < s.idMovimiento) as F,
(SELECT (CASE WHEN SUM(Importe) IS NULL THEN 0 ELSE SUM(Importe) END) as Pagos FROM Movimientos M1
WHERE
M1.idProveedor = @paramidProveedor
AND
((idTipomov = 5) OR (idTipomov = 3) OR (idTipomov = 6) OR (idTipomov = 7))
AND
M1.idMovimiento < s.idMovimiento) as P,
(Select SUM(Monto) as Saldo FROM
Cheques C INNER JOIN Movimientos M
ON M.idMovimiento = C.idMov
WHERE
M.idProveedor = @paramidProveedor
AND
C.idMov < s.idMovimiento) as Ch) + s.Debe - s.Haber
) as Saldo
FROM
(SELECT fecha , percIIBB, PercGcias, idMovimiento, idmovcampo, Importe, neto,
idOP, E.Nombre as Empresa, idProveedor, NroComprobante, idTipoMov, idOrigenPago,
M.idEmpresa, TC.Tipo, TipoLetra, NroLote, NroFact, Detalle, Vehiculo,
Importe as Debe, 0 as Haber
FROM Movimientos M INNER JOIN TipoComprobante TC
ON M.idTipoComp = TC.idComprobante LEFT JOIN Empresas E
ON M.idEmpresa = E.idEmpresa
WHERE
idProveedor = @paramidProveedor
AND
idTipomov = 1
UNION
SELECT M.fecha , M.percIIBB, M.PercGcias, M.idMovimiento, idmovcampo, Importe,
neto, idOP, E.Nombre as Empresa, M.idProveedor, NroComprobante, M.idTipoMov,
M.idOrigenPago, M.idEmpresa, TC.Tipo, TipoLetra, NroLote, NroFact, M.Detalle,
M.Vehiculo, 0 as Debe, M.Importe + (CASE WHEN (Select SUM(Monto)
FROM Cheques WHERE idMov = M.idMovimiento) IS NULL THEN 0
ELSE (Select SUM(Monto) FROM Cheques WHERE idMov = M.idMovimiento) END) as Haber
FROM Movimientos M INNER JOIN TipoComprobante TC
ON M.idTipoComp = TC.idComprobante LEFT JOIN Empresas E
ON M.idEmpresa = E.idEmpresa
WHERE
M.idProveedor = @paramidProveedor
AND
((idTipomov = 5) OR (idTipomov = 3) OR (idTipomov = 6) OR (idTipomov = 7))
GROUP BY M.fecha , M.percIIBB, M.PercGcias, M.idMovimiento, idmovcampo, E.Nombre,
M.idProveedor, NroComprobante, M.idTipoMov, M.idOrigenPago, M.idEmpresa,
TC.Tipo, TipoLetra, NroLote, NroFact, M.Detalle, M.Vehiculo, M.Importe,
M.Neto, M.idOP
) as S
WHERE S.idMovimiento >= @paramDesde
AND S.idMovimiento <= @paramHasta
AND S.Detalle LIKE '%'+@paramDetalle+'%'
ORDER BY idMovimiento
hay alguna manera mas eficiente de ir armando un resumen de cuentas ???