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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Maxi
13/07/2005 - 05:02 | Informe spam
Hola, sin analizar mucho yo pienso: seria bueno dividir las cosas en vistas
y luego hacerlo mas simple desde un query. No me quiero imaginar el
rendimiento de esta query, por eso tambien veria la forma de poner vistas
indexadas


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Antonio Ortiz R" escribió en el mensaje
news:%
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






Respuesta Responder a este mensaje
#3 Antonio Ortiz R
14/07/2005 - 01:47 | Informe spam
Gracias Maxi,

Tendre que investigar lo de vistas indexadas. Te comento que por ahora he
mejorado mucho el rendimiento de 20 mins (abriendo recordsets, durante el
formato del reporte para buscar la informacion de los subquerys) a solo
10-15 segs (con esta consulta que crear una vista en tiempo de ejecucion)
con una tabla de productos de apenas poco mas de 4000 registros, eso si, un
poco mas de ventas, compras y movs.


gracias,

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




"Maxi" escribió en el mensaje
news:
Hola, sin analizar mucho yo pienso: seria bueno dividir las cosas en


vistas
y luego hacerlo mas simple desde un query. No me quiero imaginar el
rendimiento de esta query, por eso tambien veria la forma de poner vistas
indexadas


Maxi - Buenos Aires - Argentina
Desarrollador 3 Estrellas

Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Antonio Ortiz R" escribió en el mensaje
news:%
> 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
>>
>>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida