cálculo de stocks...

21/11/2003 - 13:16 por Tolo | Informe spam
hola,

a ver, esto volverá a llevar cola, espero, por el bién de todos...

Yo tengo en mi BD q el control de stock se calcula a partir de la suma de
las líneas de documentos. Pues bién, yo hasta ahora tenía una funcion
f_stockArticulo, q dado un id_articulo me calculaba su stock a partir de un
select con un sum where articulo =@articulo

Claro, esto muy chulo, pero cuando quería sacar un listado de stock, resulta
que esa función se disparaba para cada artículo lo cual hacía que la
consulta fuera relativamente lenta.

Pensando un poco decidí cambiar, borrar mi f_StockArticulo y crear un
f_ListadoStock, que también hace un sum de lineas, pero no filtra por
artículo, con lo cual en un solo select tengo el stock de todos los
artículos por almacen y tal. Bién, luego he reconstruido mi funcion
f_StockArticulo como:

select * from f_ListadoStock where articulo=@Articulo and almacen=@almacen

Claro, esto hace q el listado de stock sea muy eficiente, pero no se hasta
que punto puede ralentizar el sistema.

Que os parece, valdría la pena haber mantenido mi consulta f_StockArticulo
como estaba antes, o realmente no habrá cambios de velocidad. Mi decisión de
cambiarla fue que si mañana por el motivo que sea, necesito cambiar el
cálculo de stock, solamente tenga q ir a cambiarlo a una función, y así me
aseguro sencillez en el codigo y sobretodo mas fiabilidad.

gracias

Preguntas similare

Leer las respuestas

#1 Accotto Maximiliano D.
21/11/2003 - 13:45 | Informe spam
Tolo !! jeje como estas con estos temas!! vas a tener que invitar una cena
para todos cheee :-)

Mira yo por lo menos no lo veo mal!! aunque disiente de la forma, aca si que
va a discutirse esto:

Yo para esto Desnormalizo la BDD, por lo cual en mi maestro de Articulos y
de Almacenes tengo un campo Qty_on_hand que es el Stock (se actualiza por
triggers)

Pero no entremos en polemicas, son solo formas de hacer las cosas, creo que
cada uno tiene una realidad,practica y experiencia.

Yo la desnormalice en este caso porque la consulta de Stock eran muy
complejas sino y ademas se me ponian un poco densas en algunos casos
(tenemos muchos articulos y transacciones)

Un saludo

Maximiliano Damian Accotto
" Tolo" escribió en el mensaje
news:ONI%
hola,

a ver, esto volverá a llevar cola, espero, por el bién de todos...

Yo tengo en mi BD q el control de stock se calcula a partir de la suma de
las líneas de documentos. Pues bién, yo hasta ahora tenía una funcion
f_stockArticulo, q dado un id_articulo me calculaba su stock a partir de


un
select con un sum where articulo =@articulo

Claro, esto muy chulo, pero cuando quería sacar un listado de stock,


resulta
que esa función se disparaba para cada artículo lo cual hacía que la
consulta fuera relativamente lenta.

Pensando un poco decidí cambiar, borrar mi f_StockArticulo y crear un
f_ListadoStock, que también hace un sum de lineas, pero no filtra por
artículo, con lo cual en un solo select tengo el stock de todos los
artículos por almacen y tal. Bién, luego he reconstruido mi funcion
f_StockArticulo como:

select * from f_ListadoStock where articulo=@Articulo and almacen=@almacen

Claro, esto hace q el listado de stock sea muy eficiente, pero no se hasta
que punto puede ralentizar el sistema.

Que os parece, valdría la pena haber mantenido mi consulta f_StockArticulo
como estaba antes, o realmente no habrá cambios de velocidad. Mi decisión


de
cambiarla fue que si mañana por el motivo que sea, necesito cambiar el
cálculo de stock, solamente tenga q ir a cambiarlo a una función, y así me
aseguro sencillez en el codigo y sobretodo mas fiabilidad.

gracias


Respuesta Responder a este mensaje
#2 ulises
21/11/2003 - 15:36 | Informe spam
En general no soy muy propenso al uso de UDF, no me gusta
por sus limitaciones actuales (veré si con Yukón me
empiezan a gustar), en todo caso ten en cuenta que las
variables table no pueden tener indices de manera que el
select que se haga con ese rowset hara un table scan para
obtener los datos, esto no sería mucho problema si el
rowset de la función es pequeño pero si es muy grande
tendrás un impacto en la performance.

Otro tema que he escuchado, no lo he comprobado, es que
los UDF usan un proceso row-by-row similar al de los
cursores, no sé si alguien sabe algo más del tema.

Saludos,
Ulises


hola,

a ver, esto volverá a llevar cola, espero, por el bién de


todos...

Yo tengo en mi BD q el control de stock se calcula a


partir de la suma de
las líneas de documentos. Pues bién, yo hasta ahora tenía


una funcion
f_stockArticulo, q dado un id_articulo me calculaba su


stock a partir de un
select con un sum where articulo =@articulo

Claro, esto muy chulo, pero cuando quería sacar un


listado de stock, resulta
que esa función se disparaba para cada artículo lo cual


hacía que la
consulta fuera relativamente lenta.

Pensando un poco decidí cambiar, borrar mi


f_StockArticulo y crear un
f_ListadoStock, que también hace un sum de lineas, pero


no filtra por
artículo, con lo cual en un solo select tengo el stock de


todos los
artículos por almacen y tal. Bién, luego he reconstruido


mi funcion
f_StockArticulo como:

select * from f_ListadoStock where articulo=@Articulo and


almacen=@almacen

Claro, esto hace q el listado de stock sea muy eficiente,


pero no se hasta
que punto puede ralentizar el sistema.

Que os parece, valdría la pena haber mantenido mi


consulta f_StockArticulo
como estaba antes, o realmente no habrá cambios de


velocidad. Mi decisión de
cambiarla fue que si mañana por el motivo que sea,


necesito cambiar el
cálculo de stock, solamente tenga q ir a cambiarlo a una


función, y así me
aseguro sencillez en el codigo y sobretodo mas fiabilidad.

gracias
Respuesta Responder a este mensaje
#3 Tolo
21/11/2003 - 16:14 | Informe spam
muy interesante la observación,

gracias

"ulises" escribió en el mensaje
news:09ed01c3b03c$cc64a4a0$
En general no soy muy propenso al uso de UDF, no me gusta
por sus limitaciones actuales (veré si con Yukón me
empiezan a gustar), en todo caso ten en cuenta que las
variables table no pueden tener indices de manera que el
select que se haga con ese rowset hara un table scan para
obtener los datos, esto no sería mucho problema si el
rowset de la función es pequeño pero si es muy grande
tendrás un impacto en la performance.

Otro tema que he escuchado, no lo he comprobado, es que
los UDF usan un proceso row-by-row similar al de los
cursores, no sé si alguien sabe algo más del tema.

Saludos,
Ulises


hola,

a ver, esto volverá a llevar cola, espero, por el bién de


todos...

Yo tengo en mi BD q el control de stock se calcula a


partir de la suma de
las líneas de documentos. Pues bién, yo hasta ahora tenía


una funcion
f_stockArticulo, q dado un id_articulo me calculaba su


stock a partir de un
select con un sum where articulo =@articulo

Claro, esto muy chulo, pero cuando quería sacar un


listado de stock, resulta
que esa función se disparaba para cada artículo lo cual


hacía que la
consulta fuera relativamente lenta.

Pensando un poco decidí cambiar, borrar mi


f_StockArticulo y crear un
f_ListadoStock, que también hace un sum de lineas, pero


no filtra por
artículo, con lo cual en un solo select tengo el stock de


todos los
artículos por almacen y tal. Bién, luego he reconstruido


mi funcion
f_StockArticulo como:

select * from f_ListadoStock where articulo=@Articulo and


almacen=@almacen

Claro, esto hace q el listado de stock sea muy eficiente,


pero no se hasta
que punto puede ralentizar el sistema.

Que os parece, valdría la pena haber mantenido mi


consulta f_StockArticulo
como estaba antes, o realmente no habrá cambios de


velocidad. Mi decisión de
cambiarla fue que si mañana por el motivo que sea,


necesito cambiar el
cálculo de stock, solamente tenga q ir a cambiarlo a una


función, y así me
aseguro sencillez en el codigo y sobretodo mas fiabilidad.

gracias
Respuesta Responder a este mensaje
#4 ulises
21/11/2003 - 19:23 | Informe spam
Sobre el tema del row-by-row processing puedes leer
http://www.sqlmag.com/Articles/Inde...icleID9036

Saludos,
Ulises

muy interesante la observación,

gracias

"ulises" escribió en el


mensaje
...
Otro tema que he escuchado, no lo he comprobado, es que
los UDF usan un proceso row-by-row similar al de los
cursores, no sé si alguien sabe algo más del tema.



...
Respuesta Responder a este mensaje
#5 Javier Loria
21/11/2003 - 19:24 | Informe spam
Hola Maximiliano:
Pero eso que haces esta bien, lo unico malo es que creas que eso es
desnormalizar.
Eso que sugieres es TECNICAMENTE correcto y NO creo que rompa ninguna de
las 3 primeras reglas normales.
1) Esta en Primer Forma Normal porque las columnas son "atomicas" y no
hay grupos Repetidos de Informacion.
2) Esta en Segunda Forma Normal porque las columnas no llaves son
totalmente dependientes de la Llave.
3) Esta en Tercera Forma Normal porque las columnas no llaves son
mutuamente independientes.
El como la haga Tolo, depende enteramente de su gusto, a mi
particularmente me parece una locura que el Saldo se calcule una y otra vez
sobre los movimientos, claro que es solo mi opinion basada en mi experiencia
y sin mayor criterio tecnico.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Accotto Maximiliano D. escribio:
Tolo !! jeje como estas con estos temas!! vas a tener que invitar una
cena para todos cheee :-)

Mira yo por lo menos no lo veo mal!! aunque disiente de la forma, aca
si que va a discutirse esto:

Yo para esto Desnormalizo la BDD, por lo cual en mi maestro de
Articulos y de Almacenes tengo un campo Qty_on_hand que es el Stock
(se actualiza por triggers)

Pero no entremos en polemicas, son solo formas de hacer las cosas,
creo que cada uno tiene una realidad,practica y experiencia.

Yo la desnormalice en este caso porque la consulta de Stock eran muy
complejas sino y ademas se me ponian un poco densas en algunos casos
(tenemos muchos articulos y transacciones)

Un saludo

hola,

a ver, esto volverá a llevar cola, espero, por el bién de todos...

Yo tengo en mi BD q el control de stock se calcula a partir de la
suma de las líneas de documentos. Pues bién, yo hasta ahora tenía
una funcion f_stockArticulo, q dado un id_articulo me calculaba su
stock a partir de un select con un sum where articulo =@articulo

Claro, esto muy chulo, pero cuando quería sacar un listado de stock,
resulta que esa función se disparaba para cada artículo lo cual
hacía que la consulta fuera relativamente lenta.

Pensando un poco decidí cambiar, borrar mi f_StockArticulo y crear un
f_ListadoStock, que también hace un sum de lineas, pero no filtra por
artículo, con lo cual en un solo select tengo el stock de todos los
artículos por almacen y tal. Bién, luego he reconstruido mi funcion
f_StockArticulo como:

select * from f_ListadoStock where articulo=@Articulo and
almacen=@almacen

Claro, esto hace q el listado de stock sea muy eficiente, pero no se
hasta que punto puede ralentizar el sistema.

Que os parece, valdría la pena haber mantenido mi consulta
f_StockArticulo como estaba antes, o realmente no habrá cambios de
velocidad. Mi decisión de cambiarla fue que si mañana por el motivo
que sea, necesito cambiar el cálculo de stock, solamente tenga q ir
a cambiarlo a una función, y así me aseguro sencillez en el codigo y
sobretodo mas fiabilidad.

gracias
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida