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

#1 Jorge Gonzalez
20/05/2006 - 01:23 | Informe spam
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
#2 Alejandro Mesa
20/05/2006 - 02:19 | Informe spam
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
#3 BitOne®
20/05/2006 - 07:25 | Informe spam
Elimina el cursor y veras como se soluciona todo.

update VcCliOfiPto810
set partacumcc = ( select sum(a.part)
from VcCliOfiPto a
where a.regional = '810'
and a.codcliente = VcCliOfiPto810.codcliente
and a.Oficina = VcCliOfiPto810.oficina )


Con esto se resolvera en segundos.


Radica los cursores, no son eficientes en sql server.

Saludos,

BitOne®

Respuesta Responder a este mensaje
#4 Kike Romero
21/05/2006 - 19:02 | Informe spam
Hola:

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

Gracias.

"BitOne®" escribió en el mensaje
news:
Elimina el cursor y veras como se soluciona todo.

update VcCliOfiPto810
set partacumcc = ( select sum(a.part)
from VcCliOfiPto a
where a.regional = '810'
and a.codcliente = VcCliOfiPto810.codcliente
and a.Oficina = VcCliOfiPto810.oficina )


Con esto se resolvera en segundos.


Radica los cursores, no son eficientes en sql server.

Saludos,

BitOne®

Respuesta Responder a este mensaje
#5 Kike Romero
21/05/2006 - 19:02 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida