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
 

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

Preguntas similares