Consulta muy grande

13/07/2005 - 03:43 por Antonio Ortiz R | Informe spam
Despues de varios dias de darle vuelta, me resolvi a cambiar un reporte con
varias subconsultas resueltas por la via 'cursores' durante la ejecucion, a
una sola consulta. El tiempo de ejecucion del reporte bajo de 20 mins a 15
segs aprox. en un AMD XP 2000+, 512 RAM, como servidor y cliente.

Se trata de un reporte que saca la existencia de un producto a cualquier
fecha, dando marcha atras a las ventas, compras y movs almacenados en
diferentes tablas.

Se que es algo pesada la consulta, pero alguien podria decirme si se puede
mejorar?

********************
SELECT DISTINCT TbaProducto.*, TbaMarca.Descripcion AS Marca,
TbaGrupo.Descripcion AS Grupo, TbaExistencia.Existencia AS Existencia,
TbaExistencia.Existencia + Case When V.Cantidad Is Null Then 0 Else
V.Cantidad End + Case When Vc.Cantidad Is Null Then 0 Else Vc.Cantidad End -
Case When C.Cantidad Is Null Then 0 Else C.Cantidad End - Case When
Cc.Cantidad Is Null Then 0 Else Cc.Cantidad End +Case When S.Cantidad Is
Null Then 0 Else S.Cantidad End + Case When Sc.Cantidad Is Null Then 0 Else
Sc.Cantidad End - Case When E.Cantidad Is Null Then 0 Else E.Cantidad End -
Case When Ec.Cantidad Is Null Then 0 Else Ec.Cantidad End as
ExistenciaFecha,V.Cantidad AS Ventas, Vc.Cantidad AS VentasC, C.Cantidad AS
Compras, Cc.Cantidad AS ComprasC,E.Cantidad AS Entradas, Ec.Cantidad
EntradasC,S.Cantidad AS Salidas, Sc.Cantidad AS
SalidasC,TbaExistencia.IDAlmacen AS IDAlmacen, (TbaExistencia.Existencia +
Case When V.Cantidad Is Null Then 0 Else V.Cantidad End + Case When
Vc.Cantidad Is Null Then 0 Else Vc.Cantidad End - Case
When C.Cantidad Is Null Then 0 Else C.Cantidad End - Case When Cc.Cantidad
Is Null Then 0 Else Cc.Cantidad End +Case When S.Cantidad Is Null Then 0
Else S.Cantidad End + Case When Sc.Cantidad Is Null Then 0 Else Sc.Cantidad
End - Case When E.Cantidad Is Null Then 0 Else E.Cantidad End - Case When
Ec.Cantidad Is Null Then 0 Else Ec.Cantidad End)* TbaProducto.CostoCalc as
Importe, TbaProducto.CostoCalc * TbaExistencia.Existencia AS Importe2

FROM TbaProducto INNER JOIN TbaExistencia ON TbaProducto.IDProducto TbaExistencia.IDProducto LEFT OUTER JOIN TbaMarca ON TbaProducto.IDMarca TbaMarca.IDMarca LEFT OUTER JOIN TbaGrupo ON TbaProducto.IDGrupo TbaGrupo.IDGrupo LEFT OUTER JOIN

(SELECT SUM(TbaVentaDet.Cantidad) AS Cantidad,Min(TbaVentaDet.IDProducto) As
IDProducto FROM TbaVenta INNER JOIN TbaVentaDet ON TbaVenta.IDVenta TbaVentaDet.IDVenta WHERE (Fecha >= '20050525') AND (Afecto <> 0) AND
(IDAlmacen = 1)GROUP BY TbaVentaDet.IDProducto) V ON TbaProducto.IDProducto
= V.IDProducto LEFT OUTER JOIN (SELECT SUM
(TbaVentaDet.Cantidad * TbaCompuesto.Cantidad) AS Cantidad,
MIN(TbaVentaDet.IDProducto) AS IDProducto FROM TbaVenta INNER JOIN
TbaVentaDet ON TbaVenta.IDVenta = TbaVentaDet.IDVenta INNER JOIN
TbaCompuesto ON TbaVentaDet.IDProducto = TbaCompuesto.IDProductoCompuesto
WHERE (Fecha >= '20050525') AND (Afecto <> 0) AND (IDAlmacen = 1) GROUP BY
TbaVentaDet.IDProducto) Vc

ON TbaProducto.IDProducto = Vc.IDProducto LEFT OUTER JOIN

(SELECT SUM(TbaCompraDet.Cantidad) AS Cantidad,TbaCompraDet.IDProducto AS
IDProducto FROM TbaCompra INNER JOIN TbaCompraDet ON TbaCompra.IDCompra TbaCompraDet.IDCompra WHERE (FechaFactura >= '20050525') AND
(TbaCompra.Afecto <> 0) GROUP BY TbaCompraDet.IDProducto) C
ON TbaProducto.IDProducto = c.IDProducto Left Outer Join

(Select Sum(TbaCompraDet.Cantidad*TbaCompuesto.Cantidad) as Cantidad,
Min(TbaCompuesto.IDProducto) As IDProducto From TbaCompra Inner Join
TbaCompraDet On TbaCompra.IDCompra=TbaCompraDet.IDCompra Inner Join
TbaCompuesto On TbaCompraDet.IDProducto=TbaCompuesto.IDProductoCompuesto
Where (FechaFactura >= '20050525') And (TbaCompra.Afecto<>0) Group By
TbaCompuesto.IDProducto) Cc
on TbaProducto.IDProducto=Cc.IDProducto Left Outer Join

(Select Sum(TbaMovDet.Cantidad) As Cantidad, Min(TbaMovDet.IDProducto) As
IDProducto From TbaMov Inner Join TbaMovDet On TbaMov.IDMov=TbaMovDet.IDMov
Inner Join TbaTipoMov On TbaMov.IDTipoMov=TbaTipoMov.IDTipoMov Where
(TbaTipoMov.Incremento<>0) And (Fecha>='20050525') And (TbaMov.Afecto<>0)
And (TbaMov.IDAlmacen=1) Group by TbaMovDet.IDProducto) E
on TbaProducto.IDProducto = E.IDProducto Left Outer Join

(SELECT SUM(TbaMovDet.Cantidad * TbaCompuesto.Cantidad) AS Cantidad,
MIN(TbaCompuesto.IDProducto) AS IDProducto FROM TbaMov INNER JOIN TbaMovDet
ON TbaMov.IDMov = TbaMovDet.IDMov INNER JOIN TbaTipoMov ON TbaMov.IDTipoMov
= TbaTipoMov.IDTipoMov INNER JOIN TbaCompuesto ON TbaMovDet.IDProducto TbaCompuesto.IDProducto WHERE (TbaTipoMov.Incremento <> 0) AND (Fecha >'20050525') AND (TbaMov.Afecto <> 0) And (TbaMov.IDAlmacen=1) Group BY
TbaCompuesto.I
DProducto) Ec ON TbaProducto.IDProducto = Ec.IDProducto Left Outer Join
(Select Sum(TbaMovDet.Cantidad) As Cantidad, Min(TbaMovDet.IDProducto) As
IDProducto From TbaMov Inner Join TbaMovDet On TbaMov.IDMov=TbaMovDet.IDMov
Inner Join TbaTipoMov On TbaMov.IDTipoMov=TbaTipoMov.IDTipoMov Where
(TbaTipoMov.Incremento=0) And (Fecha>='20050525') And (TbaMov.Afecto<>0) And
(TbaMov.IDAlmacen=1) Group by TbaMovDet.IDProducto) S on
TbaProducto.IDProducto=S.IDProducto LEFT OUTER JOIN (SELECT
SUM(TbaMovDet.Cantidad * TbaCompuesto.Cantidad) AS Cantidad,
MIN(TbaCompuesto.IDProducto) AS IDProducto FROM TbaMov INNER JOIN TbaMovDet
ON TbaMov.IDMov = TbaMovDet.IDMov INNER JOIN TbaTipoMov ON TbaMov.IDTipoMov
= TbaTipoMov.IDTipoMov INNER JOIN TbaCompuesto ON TbaMovDet.IDProducto TbaCompuesto.IDProducto WHERE (TbaTipoMov.Incremento = 0) AND (Fecha >'20050525') AND (TbaMov.Afecto <> 0) And (TbaMov.IDAlmacen=1) GROUP BY
TbaCompuesto.IDProducto) Sc ON TbaProducto.IDProducto = Sc.IDProducto WHERE
(TbaProducto.Descripcion IS NOT N
ULL) AND (TbaProducto.Activo <> 0) AND (TbaProducto.FechaAlta <= '20050525')
AND (TbaExistencia.IDAlmacen = 1)



gracias,

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com
 

Leer las respuestas

#1 Antonio Ortiz R
13/07/2005 - 04:27 | Informe spam
Por lo pronto alguien ya me observo el cambio de CASE para validar los nulos
por ISNULL(campo,0), el cual ya realice

alguna otra sugerencia?

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com


"Antonio Ortiz R" escribió en el mensaje
news:
Despues de varios dias de darle vuelta, me resolvi a cambiar un reporte


con
varias subconsultas resueltas por la via 'cursores' durante la ejecucion,


a
una sola consulta. El tiempo de ejecucion del reporte bajo de 20 mins a 15
segs aprox. en un AMD XP 2000+, 512 RAM, como servidor y cliente.

Se trata de un reporte que saca la existencia de un producto a cualquier
fecha, dando marcha atras a las ventas, compras y movs almacenados en
diferentes tablas.

Se que es algo pesada la consulta, pero alguien podria decirme si se puede
mejorar?

********************
SELECT DISTINCT TbaProducto.*, TbaMarca.Descripcion AS Marca,
TbaGrupo.Descripcion AS Grupo, TbaExistencia.Existencia AS Existencia,
TbaExistencia.Existencia + Case When V.Cantidad Is Null Then 0 Else
V.Cantidad End + Case When Vc.Cantidad Is Null Then 0 Else Vc.Cantidad


End -
Case When C.Cantidad Is Null Then 0 Else C.Cantidad End - Case When
Cc.Cantidad Is Null Then 0 Else Cc.Cantidad End +Case When S.Cantidad Is
Null Then 0 Else S.Cantidad End + Case When Sc.Cantidad Is Null Then 0


Else
Sc.Cantidad End - Case When E.Cantidad Is Null Then 0 Else E.Cantidad


End -
Case When Ec.Cantidad Is Null Then 0 Else Ec.Cantidad End as
ExistenciaFecha,V.Cantidad AS Ventas, Vc.Cantidad AS VentasC, C.Cantidad


AS
Compras, Cc.Cantidad AS ComprasC,E.Cantidad AS Entradas, Ec.Cantidad
EntradasC,S.Cantidad AS Salidas, Sc.Cantidad AS
SalidasC,TbaExistencia.IDAlmacen AS IDAlmacen, (TbaExistencia.Existencia +
Case When V.Cantidad Is Null Then 0 Else V.Cantidad End + Case When
Vc.Cantidad Is Null Then 0 Else Vc.Cantidad End - Case
When C.Cantidad Is Null Then 0 Else C.Cantidad End - Case When Cc.Cantidad
Is Null Then 0 Else Cc.Cantidad End +Case When S.Cantidad Is Null Then 0
Else S.Cantidad End + Case When Sc.Cantidad Is Null Then 0 Else


Sc.Cantidad
End - Case When E.Cantidad Is Null Then 0 Else E.Cantidad End - Case When
Ec.Cantidad Is Null Then 0 Else Ec.Cantidad End)* TbaProducto.CostoCalc as
Importe, TbaProducto.CostoCalc * TbaExistencia.Existencia AS Importe2

FROM TbaProducto INNER JOIN TbaExistencia ON TbaProducto.IDProducto > TbaExistencia.IDProducto LEFT OUTER JOIN TbaMarca ON TbaProducto.IDMarca > TbaMarca.IDMarca LEFT OUTER JOIN TbaGrupo ON TbaProducto.IDGrupo > TbaGrupo.IDGrupo LEFT OUTER JOIN

(SELECT SUM(TbaVentaDet.Cantidad) AS Cantidad,Min(TbaVentaDet.IDProducto)


As
IDProducto FROM TbaVenta INNER JOIN TbaVentaDet ON TbaVenta.IDVenta > TbaVentaDet.IDVenta WHERE (Fecha >= '20050525') AND (Afecto <> 0) AND
(IDAlmacen = 1)GROUP BY TbaVentaDet.IDProducto) V ON


TbaProducto.IDProducto
= V.IDProducto LEFT OUTER JOIN (SELECT SUM
(TbaVentaDet.Cantidad * TbaCompuesto.Cantidad) AS Cantidad,
MIN(TbaVentaDet.IDProducto) AS IDProducto FROM TbaVenta INNER JOIN
TbaVentaDet ON TbaVenta.IDVenta = TbaVentaDet.IDVenta INNER JOIN
TbaCompuesto ON TbaVentaDet.IDProducto = TbaCompuesto.IDProductoCompuesto
WHERE (Fecha >= '20050525') AND (Afecto <> 0) AND (IDAlmacen = 1) GROUP BY
TbaVentaDet.IDProducto) Vc

ON TbaProducto.IDProducto = Vc.IDProducto LEFT OUTER JOIN

(SELECT SUM(TbaCompraDet.Cantidad) AS Cantidad,TbaCompraDet.IDProducto AS
IDProducto FROM TbaCompra INNER JOIN TbaCompraDet ON TbaCompra.IDCompra > TbaCompraDet.IDCompra WHERE (FechaFactura >= '20050525') AND
(TbaCompra.Afecto <> 0) GROUP BY TbaCompraDet.IDProducto) C
ON TbaProducto.IDProducto = c.IDProducto Left Outer Join

(Select Sum(TbaCompraDet.Cantidad*TbaCompuesto.Cantidad) as Cantidad,
Min(TbaCompuesto.IDProducto) As IDProducto From TbaCompra Inner Join
TbaCompraDet On TbaCompra.IDCompra=TbaCompraDet.IDCompra Inner Join
TbaCompuesto On TbaCompraDet.IDProducto=TbaCompuesto.IDProductoCompuesto
Where (FechaFactura >= '20050525') And (TbaCompra.Afecto<>0) Group By
TbaCompuesto.IDProducto) Cc
on TbaProducto.IDProducto=Cc.IDProducto Left Outer Join

(Select Sum(TbaMovDet.Cantidad) As Cantidad, Min(TbaMovDet.IDProducto) As
IDProducto From TbaMov Inner Join TbaMovDet On


TbaMov.IDMov=TbaMovDet.IDMov
Inner Join TbaTipoMov On TbaMov.IDTipoMov=TbaTipoMov.IDTipoMov Where
(TbaTipoMov.Incremento<>0) And (Fecha>='20050525') And (TbaMov.Afecto<>0)
And (TbaMov.IDAlmacen=1) Group by TbaMovDet.IDProducto) E
on TbaProducto.IDProducto = E.IDProducto Left Outer Join

(SELECT SUM(TbaMovDet.Cantidad * TbaCompuesto.Cantidad) AS Cantidad,
MIN(TbaCompuesto.IDProducto) AS IDProducto FROM TbaMov INNER JOIN


TbaMovDet
ON TbaMov.IDMov = TbaMovDet.IDMov INNER JOIN TbaTipoMov ON


TbaMov.IDTipoMov
= TbaTipoMov.IDTipoMov INNER JOIN TbaCompuesto ON TbaMovDet.IDProducto > TbaCompuesto.IDProducto WHERE (TbaTipoMov.Incremento <> 0) AND (Fecha >> '20050525') AND (TbaMov.Afecto <> 0) And (TbaMov.IDAlmacen=1) Group BY
TbaCompuesto.I
DProducto) Ec ON TbaProducto.IDProducto = Ec.IDProducto Left Outer Join
(Select Sum(TbaMovDet.Cantidad) As Cantidad, Min(TbaMovDet.IDProducto) As
IDProducto From TbaMov Inner Join TbaMovDet On


TbaMov.IDMov=TbaMovDet.IDMov
Inner Join TbaTipoMov On TbaMov.IDTipoMov=TbaTipoMov.IDTipoMov Where
(TbaTipoMov.Incremento=0) And (Fecha>='20050525') And (TbaMov.Afecto<>0)


And
(TbaMov.IDAlmacen=1) Group by TbaMovDet.IDProducto) S on
TbaProducto.IDProducto=S.IDProducto LEFT OUTER JOIN (SELECT
SUM(TbaMovDet.Cantidad * TbaCompuesto.Cantidad) AS Cantidad,
MIN(TbaCompuesto.IDProducto) AS IDProducto FROM TbaMov INNER JOIN


TbaMovDet
ON TbaMov.IDMov = TbaMovDet.IDMov INNER JOIN TbaTipoMov ON


TbaMov.IDTipoMov
= TbaTipoMov.IDTipoMov INNER JOIN TbaCompuesto ON TbaMovDet.IDProducto > TbaCompuesto.IDProducto WHERE (TbaTipoMov.Incremento = 0) AND (Fecha >> '20050525') AND (TbaMov.Afecto <> 0) And (TbaMov.IDAlmacen=1) GROUP BY
TbaCompuesto.IDProducto) Sc ON TbaProducto.IDProducto = Sc.IDProducto


WHERE
(TbaProducto.Descripcion IS NOT N
ULL) AND (TbaProducto.Activo <> 0) AND (TbaProducto.FechaAlta <'20050525')
AND (TbaExistencia.IDAlmacen = 1)



gracias,

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com


Preguntas similares