Ayuda en revision de procedimiento

19/05/2006 - 23:38 por Javier E. Romero T. | Informe spam
Buenas Tardes:

Una usuaria ejecuta un query y me dice que se demora 13 horas, tome ese
query y lo trate de correr en la misma base de datos pero en una mejor
maquina y aborta despues de un tiempo.

No se que pueda estar mal, agradezco su colaboracion ya que de estos temas
carezco de conocimiento.

Adjunto el Query

Gracias





BEGIN

DECLARE @Ofi char(5), @Ofi2 char(5)
DECLARE @Part float, @PartAcum float
/*DECLARE @PartTotal float, @PartAcumTotal float*/
DECLARE @CodCliente numeric(18)

DECLARE X CURSOR FAST_FORWARD READ_ONLY FOR

SELECT CodCliente,Oficina,PartCC
FROM VcCliOfiPto
where REGIONAL = '810' /*and PromedioCC >100*/
ORDER BY Oficina,PartCC DESC

OPEN X

FETCH NEXT FROM X INTO
@CodCliente, @Ofi, @Part
SET @Ofi2=0

WHILE @@FETCH_STATUS=0

BEGIN
IF @Ofi <> @Ofi2 SELECT @PartAcum=0

/*acumula productos*/
SELECT @PartAcum=@PartAcum+@Part

/*
suma totales
SET @PartTotal=@PartCC+@PartAH+@PartCERT+@PartCARTMLYME+@PartTC
SET
@PartAcumTotal=@PartAcumCC+@PartAcumAH+@PartAcumCERT+@PartAcumCARTMLYME+@PartAcumTC
*/

UPDATE VcCliOfiPto810
SET PartAcumCC=@PartAcum
WHERE /*PromedioCC >100 and */ codcliente=@CodCliente

SET @Ofi2=@Ofi
PRINT @CodCliente
FETCH NEXT FROM X INTO
@CodCliente,@Ofi,@Part
END

CLOSE X

DEALLOCATE X

END

Preguntas similare

Leer las respuestas

#6 Kike Romero
21/05/2006 - 19:02 | Informe spam
Hola:

¿Esta propiedad por dende se configura?.

Gracias


"Jorge Gonzalez" escribió en el mensaje
news:
Tu consulta está bastante sencilla, así que lo que debe estar causando el
problema es seguramente la cantidad de registros que requiere procesar y


el
hecho de que lo estás haciendo a través de un cursor.

En segundo caso el query termina porque seguramente tenés un valor fijado


en
la propiedad command time de la conexión, en el segundo logra terminar
porque esa propiedad está en 0 lo cual significa esperar para siempre.

Tengo la impresión de que la funcionalidad que requieres puedes


conseguirla
al momento en que los registros se agregan a la tabla de forma que sería
mucho más eficiente.

También creo que podrías conseguir la misma funcioanlidad con un SQL de
actualización. Analiza tu consulta y trata con una forma más eficiente que
el mero uso de un cursor.

saludos


"Javier E. Romero T." escribió


en
el mensaje news:
> Buenas Tardes:
>
> Una usuaria ejecuta un query y me dice que se demora 13 horas, tome ese
> query y lo trate de correr en la misma base de datos pero en una mejor
> maquina y aborta despues de un tiempo.
>
> No se que pueda estar mal, agradezco su colaboracion ya que de estos


temas
> carezco de conocimiento.
>
> Adjunto el Query
>
> Gracias
>
>
>
>
>
> BEGIN
>
> DECLARE @Ofi char(5), @Ofi2 char(5)
> DECLARE @Part float, @PartAcum float
> DECLARE @CodCliente numeric(18)
>
> DECLARE X CURSOR FAST_FORWARD READ_ONLY FOR
>
> SELECT CodCliente,Oficina,PartCC
> FROM VcCliOfiPto
> where REGIONAL = '810' /*and PromedioCC >100*/
> ORDER BY Oficina,PartCC DESC
>
> OPEN X
>
> FETCH NEXT FROM X INTO
> @CodCliente, @Ofi, @Part
> SET @Ofi2=0
>
> WHILE @@FETCH_STATUS=0
>
> BEGIN
> IF @Ofi <> @Ofi2 SELECT @PartAcum=0
>
> SELECT @PartAcum=@PartAcum+@Part
>
>
> UPDATE VcCliOfiPto810
> SET PartAcumCC=@PartAcum
> WHERE codcliente=@CodCliente
>
> SET @Ofi2=@Ofi
> PRINT @CodCliente
> FETCH NEXT FROM X INTO
> @CodCliente,@Ofi,@Part
> END
>
> CLOSE X
>
> DEALLOCATE X
>
> END
>


Respuesta Responder a este mensaje
#7 BitOne®
22/05/2006 - 00:38 | Informe spam
Claro, al igual que tienes el cursor creado, creas una consulta que necesites bien elaborada, la colocas en un procedimiento almacenado, pasas los parametros debido y listo.

Saludos,

BitOne®


"Kike Romero" escribió en el mensaje news:
Hola:

Ese es un query ue solo se ejecuta desde el analyzer ... ¿asi tambien se
puede?

Gracias.

"Alejandro Mesa" escribió en el mensaje
news:
Javier,

La solucion esta en eliminar el cursor"y usar una sentnecia orientada a
conjuntos.

update VcCliOfiPto810
set PartAcumCC = (
select sum(PartCC)
from VcCliOfiPto as a
where
REGIONAL = '810'
and a.CodCliente = VcCliOfiPto810a.CodCliente
and a.Oficina = VcCliOfiPto810.Oficina
)

Si solo quieres actualizar las filas en VcCliOfiPto810 que machan
alguna fila en VcCliOfiPto, entonces adiciona la clausula "where" a la
sentencia üpdate.

...
where exists (
select *
from VcCliOfiPto as a
where
REGIONAL = '810'
and a.CodCliente = VcCliOfiPto810a.CodCliente
and a.Oficina = VcCliOfiPto810.Oficina
)


AMB


Respuesta Responder a este mensaje
#8 Javier E. Romero T.
22/05/2006 - 18:48 | Informe spam
Hola Alejandro ...

No se si te entendi mal, pero lo que me envias es para reemplazarlo e alguna
parte del procedimiento original.

Parece ser esa la idea, pero no se en donde ubicarlo o si esta sentencia
reemplaza a la que habia enviado anteriormente

Muchas Gracias.

J.R.



"Alejandro Mesa" wrote:

Javier,

La solucion esta en eliminar el cursor"y usar una sentnecia orientada a
conjuntos.

update VcCliOfiPto810
set PartAcumCC = (
select sum(PartCC)
from VcCliOfiPto as a
where
REGIONAL = '810'
and a.CodCliente = VcCliOfiPto810a.CodCliente
and a.Oficina = VcCliOfiPto810.Oficina
)

Si solo quieres actualizar las filas en VcCliOfiPto810 que machan
alguna fila en VcCliOfiPto, entonces adiciona la clausula "where" a la
sentencia üpdate.


where exists (
select *
from VcCliOfiPto as a
where
REGIONAL = '810'
and a.CodCliente = VcCliOfiPto810a.CodCliente
and a.Oficina = VcCliOfiPto810.Oficina
)


AMB


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