TABLE SCAN en INSERTED

28/10/2003 - 15:37 por Juan | Informe spam
Buenas, paso a contarles mi problema a ver si pueden darme
una mano.

Tengo una aplicación que trabaja con VB y Stored
Procedures que tienen gran parte de las reglas de negocio.

Estuve revisando un Stored Procedure pues tengo un
problema de performance, donde detecto que el mayor
problema se encuentra en uno de los Triggers de una Tabla.

El tema es que el problema se da cuando hago un select de
la tabla INSERTED o la tabla DELETED dentro del Trigger de
UPDATE asignando los valores de algunos campos de la tabla
modificada a variables. La forma del select es la siguiente

Select @a = campo1
@b = campo2
@3 = campo3
from Inserted

Select @a1 = campo1
@b1 = campo2
@31 = campo3
from DELETED


Alguna idea?
Gracias
Juan Manuel Caballero.

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
28/10/2003 - 15:58 | Informe spam
Juan,
Seguramente querrás guardar esos valores según determinadas condiciones,
quiero decir, si tenés más de una fila en INSERTED o DELETED recorrerá toda
la tabla y se quedará con la última que lea.
De todas maneras, ¿podrías postear el Trigger? Me llama la atención que
tengas que guardar valores. ¿Estás usando cursores además?

Saludos... Liliana.

"Juan" escribió en el mensaje
news:0d5901c39d61$0442efb0$
Buenas, paso a contarles mi problema a ver si pueden darme
una mano.

Tengo una aplicación que trabaja con VB y Stored
Procedures que tienen gran parte de las reglas de negocio.

Estuve revisando un Stored Procedure pues tengo un
problema de performance, donde detecto que el mayor
problema se encuentra en uno de los Triggers de una Tabla.

El tema es que el problema se da cuando hago un select de
la tabla INSERTED o la tabla DELETED dentro del Trigger de
UPDATE asignando los valores de algunos campos de la tabla
modificada a variables. La forma del select es la siguiente

Select @a = campo1
@b = campo2
@3 = campo3
from Inserted

Select @a1 = campo1
@b1 = campo2
@31 = campo3
from DELETED


Alguna idea?
Gracias
Juan Manuel Caballero.
Respuesta Responder a este mensaje
#2 Accotto Maximiliano Damian
28/10/2003 - 16:11 | Informe spam
Hola!! me parece que hay algo mal en ese trigger, solo estas guardando un
valor? estas usando algun cursor o algo asi? porque no me explicas o me
envias el trigger completo (con la explicacion de lo que esperas del mismo)
asi lo analizo y te puedo ayudar.

Un saludo

Accotto Maximiliano Damian
"Juan" escribió en el mensaje
news:0d5901c39d61$0442efb0$
Buenas, paso a contarles mi problema a ver si pueden darme
una mano.

Tengo una aplicación que trabaja con VB y Stored
Procedures que tienen gran parte de las reglas de negocio.

Estuve revisando un Stored Procedure pues tengo un
problema de performance, donde detecto que el mayor
problema se encuentra en uno de los Triggers de una Tabla.

El tema es que el problema se da cuando hago un select de
la tabla INSERTED o la tabla DELETED dentro del Trigger de
UPDATE asignando los valores de algunos campos de la tabla
modificada a variables. La forma del select es la siguiente

Select @a = campo1
@b = campo2
@3 = campo3
from Inserted

Select @a1 = campo1
@b1 = campo2
@31 = campo3
from DELETED


Alguna idea?
Gracias
Juan Manuel Caballero.
Respuesta Responder a este mensaje
#3 Anonimo
28/10/2003 - 16:52 | Informe spam
El trigger se dispara de acuerdo a la siguiente sentencia,
es un update de un registro puntual dentro de un stored
Procedure que utiliza un cursor para modificar
puntualmente cada registro.

UPDATE SAR_Reclamos SET

Rec_EstActActual =
@EstadoActiv,
Rec_Actsiguiente =
@Actividad,
Rec_EstOdtAct =
0,
Rec_ActAnterior =
@ActividadAct,
Oen_IdOds =
@IdOds
WHERE
Rec_numero =
@NumeroODT


AHI VA EL TRIGGER.
Gracias y Saludos


CREATE TRIGGER SAR_TU_REC ON dbo.SAR_Reclamos
FOR UPDATE
AS
IF UPDATE(Rec_Estado) or UPDATE(Rec_ActSiguiente) or UPDATE
(Rec_FechaResolucion)
BEGIN
Declare
@Estado char(1),
@Numero varchar(14),
@Parte varchar(14),
@Obs varchar(255),
@ActivUsr int,
@CodDesest int,
@Usuario int,
@NumeroAso varchar(14),
@FecReso datetime,
@ParteReso varchar(14),
@OldFecReso datetime,
@OldParteReso varchar(14),
@Asociado char(1),
@ActAnterior int,
@FecFinInterv datetime,
@FecBaja datetime,
@RacId Int /* 05/07/00 */
/*
**
*/
Select @Usuario = Usr_IdUsuario
From SAR_Usuario (nolock)
Where rtrim(Usr_Nombre) = lower(system_user)
/*
** OBTENER LOS VALORES NUEVOS DE LOS CAMPOS MODIFICADOS
*/
BEGIN -- Este SELECT TIENE COSTO 76
Select @Estado = Rec_Estado,
@Numero = Rec_Numero,
@Parte = Rec_ParteIntervencion,
@Obs = Rec_Observacion,
@ActivUsr = Rec_ActSiguiente,
@CodDesest = Rec_CodDesestima,
@FecReso = Rec_FechaResolucion,
@FecFinInterv = Rec_FechaIntervencion,
@ParteReso = Rec_ParteResolucion,
@Asociado = Rec_Asociado,
@ActAnterior = Rec_ActAnterior,
@FecBaja = Rec_FechaBaja,
@RacId = RAC_IdEnvRF
From Inserted

Select -- Este select tiene costo 76
@OldFecReso = Rec_FechaResolucion,
@OldParteReso = Rec_ParteResolucion
From Deleted

/*
** SOLO ENTRAR SI ES PADRE
*/
If @Asociado = 'P'
BEGIN
IF @Estado = 'F'
Begin
Update SAR_Reclamos Set
Rec_Estado = @Estado,
Rec_FechaBaja = @FecBaja,
Rec_Asignado = 0 ,
Rec_EstActActual = 5,
Rec_ActSiguiente = @ActivUsr,
Rec_FechaResolucion = Case when Rec_FechaResolucion Is
null then @FecReso
when Rec_FechaResolucion = @OldFecReso then @FecReso
else Rec_FechaResolucion End,
Rec_ParteResolucion = Case when Rec_ParteResolucion is
Null then @ParteReso
when Rec_ParteResolucion = @OldParteReso then @ParteReso
else Rec_ParteResolucion End,
Rec_ActAnterior = @ActAnterior,
RAC_IdEnvRF = @RacId
From
SAR_ReclamosAsociados (nolock)
Where
Asi_NumeroAso = Rec_Numero And
Asi_Numero = @Numero And
Asi_Accion = 'A' And
Asi_Activo = 'S'
End
IF @Estado = 'I'
Begin
Update SAR_Reclamos Set
Rec_Estado = @Estado,
Rec_FechaIntervencion = @FecFinInterv,
Rec_ParteIntervencion = @Parte,
Rec_Asignado = 0,
Rec_ActSiguiente = @ActivUsr,
Rec_FechaResolucion = Case when Rec_FechaResolucion Is
null then @FecReso
when Rec_FechaResolucion = @OldFecReso then @FecReso
else Rec_FechaResolucion End,
Rec_ParteResolucion = Case when Rec_ParteResolucion is
Null then @ParteReso
when Rec_ParteResolucion = @OldParteReso then @ParteReso
else Rec_ParteResolucion End,
Rec_ActAnterior = @ActAnterior
From
SAR_ReclamosAsociados (nolock)
Where

Asi_NumeroAso = Rec_Numero And
Asi_Numero = @Numero And
Asi_Accion = 'A' And
Asi_Activo = 'S'
End
IF @Estado = 'N'
Begin
Update SAR_Reclamos Set
Rec_Estado = @Estado,
Rec_FechaIntervencion = @FecFinInterv,
Rec_ParteIntervencion = @Parte,
Rec_Asignado = 0,
Rec_ActSiguiente = @ActivUsr,
Rec_FechaResolucion = Case when Rec_FechaResolucion Is
null then @FecReso
when Rec_FechaResolucion = @OldFecReso then @FecReso
else Rec_FechaResolucion End,
Rec_ParteResolucion = Case when Rec_ParteResolucion is
Null then @ParteReso
when Rec_ParteResolucion = @OldParteReso then @ParteReso
else Rec_ParteResolucion End,
Rec_ActAnterior = @ActAnterior
From
SAR_ReclamosAsociados (nolock)
Where
Asi_NumeroAso = Rec_Numero And
Asi_Numero = @Numero And
Asi_Accion = 'A' And
Asi_Activo = 'S'
End

If @Estado = 'B'
Begin
Update
SAR_Reclamos
SET
Rec_Observacion = '(ODT Desestimada) - ' + Rtrim
(Rec_Observacion),
Rec_Estado = 'B' ,
Rec_FechaBaja = @FecBaja,
Rec_ActSiguiente = @ActivUsr,
Rec_EstActActual = 2,
Rec_Asignado = 0,
Rec_CodDesestima = @CodDesest,
Rec_FechaResolucion = Case when Rec_FechaResolucion Is
null then @FecReso
when Rec_FechaResolucion = @OldFecReso then @FecReso
else Rec_FechaResolucion End,
Rec_ParteResolucion = Case when Rec_ParteResolucion is
Null then @ParteReso
when Rec_ParteResolucion = @OldParteReso then @ParteReso
else Rec_ParteResolucion End,
Rec_ActAnterior = @ActAnterior,
RAC_IdEnvRF = @RacId
From
SAR_ReclamosAsociados (nolock)
Where
Asi_NumeroAso = Rec_Numero And
Asi_Numero = @Numero And
Asi_Accion = 'A' And
Asi_Activo = 'S'

/*
** INSERTAR EL REGISTRO DEL HIJO EN LA TABLA ASOCIACIONES
*/
Declare Tmp Cursor For
Select Asi_NumeroAso
From Sar_ReclamosAsociados (NOLOCK)
Where
Asi_Numero = @Numero And
Asi_Accion = 'A' And
Asi_Activo = 'S'
Open Tmp
Fetch Next From Tmp Into @NumeroAso
While (@@Fetch_Status <> -1 )
Begin
Insert Into SAR_ReclamosActividad
(Rac_Numero ,Rac_FechaActividad ,Rac_Actividad,
Rac_CodigoEstado, Rac_AccionObs , Rac_Operador ,
OEN_IDODS )
Values
(@NumeroAso , GetDate() , @ActivUsr, 2 ,
'Desestimado Por Asociacion' , @Usuario , null)

Fetch Next From Tmp Into @NumeroAso
End
Deallocate Tmp
End
End
END
END
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida