Consultas sobre procedimientos almacenados

30/10/2006 - 15:45 por jcac | Informe spam
Hola lista estoy cambiando algunos sp que estan utilizando tablas
temporales, y probando en el query analizer su tiempo de respuesta y bueno
los sp con temporales se demoran mucho mas que los sp que he cambiado, pero
ahora cuando los ejecuto desde mi aplicativo estos me devyuelven tiempo de
espera el sp que no tiene temporales, en cambio el sp que si tiene
temporales que se demora mas no me devuelve tiempo de espera, les adjunto el
codigo de ambos sps

SP con Temporales

CREATE Procedure C_SALDSS_MayorAuxiliarSoles
@Ano char(4),
@Mes char(2),
@CuentaIni Cuenta,
@CuentaFin Cuenta
AS
Set Nocount On
SELECT Distinct D.CUEN_CodCta, C.CUEN_Desc, Convert(Decimal(12,2),0) AS
DebeAcum, Convert(Decimal(12,2),0) AS HaberAcum,
Convert(Decimal(12,2),0) AS DebeMes, Convert(Decimal(12,2),0) AS HaberMes,
Convert(Decimal(12,2),0) AS DebeResul,
Convert(Decimal(12,2),0) AS HaberResul, Convert(Decimal(12,2),0) AS Deudor,
Convert(Decimal(12,2),0) AS Acreedor
Into #Mayor
FROM DetVoucher D LEFT OUTER JOIN Cuentas C ON D.CUEN_ano = C.CUEN_ano AND
D.CUEN_CodCta = C.CUEN_CodCta
Where CABV_ano = @Ano and CABV_mes <= @Mes Order by D.Cuen_CodCta

Select CUEN_CodCta, sum(SALD_Debe) as Debe, sum(SALD_Haber) as Haber,
sum(SALD_DebeDol) as DebeDol,
sum(SALD_HaberDol) as HaberDol
Into #Inicial
From SaldosCont
Where SALD_Mes < @Mes and SALD_ano = @Ano
Group by CUEN_CodCta

Update #Mayor Set
DebeAcum = Debe ,
HaberAcum = Haber
From #Mayor M inner join #Inicial I on M.CUEN_CodCta = I.CUEN_CodCta

Update #Mayor Set
DebeMes = SALD_Debe,
HaberMes = SALD_Haber
From #Mayor M inner join SaldosCont I on M.CUEN_CodCta = I.CUEN_CodCta
Where I.SALD_Ano = @Ano and I.SALD_Mes = @Mes

Update #Mayor Set
DebeResul = DebeAcum + DebeMes,
HaberResul = HaberAcum + HaberMes

Update #Mayor Set
Deudor = Case When (DebeResul - HaberResul) > 0 then DebeResul - HaberResul
else 0 end,
Acreedor = Case When (HaberResul - DebeResul) > 0 then HaberResul -
DebeResul else 0 end

Select * from #Mayor Where CUEN_CodCta between @CuentaIni and @CuentaFin
Order by CUEN_CodCta
Set NoCount Off
/***************************************************/


SP sin Temporales

Create Procedure C_SALDSS_MayorAuxiliarSoles -- C_SALDSS_MayorAuxiliarSoles
'2006', '09', '16', '16.9.99.99.99.99'
@Ano Char(4), @Mes Char(2), @CuentaIni Cuenta, @CuentaFin Cuenta
As
Select A.CUEN_CodCta, C.CUEN_Desc, A.DebeAcum, A.HaberAcum, A.DebeMes,
A.HaberMes, A.DebeAcum + A.DebeMes As DebeResul, A.HaberAcum + A.HaberMes As
HaberResul,
Case When (A.DebeAcum + A.DebeMes) - (A.HaberAcum + A.HaberMes) > 0 Then
(A.DebeAcum + A.DebeMes) - (A.HaberAcum + A.HaberMes) Else 0 End As Deudor,
Case When (A.HaberAcum + A.HaberMes) - (A.DebeAcum + A.DebeMes) > 0 Then
(A.HaberAcum + A.HaberMes) - (A.DebeAcum + A.DebeMes) Else 0 End As Acreedor
From (Select D.CUEN_CodCta,
(Select Sum(SALD_Debe) From SaldosCont Where SALD_Mes < @Mes And
CUEN_CodCta = D.CUEN_CodCta And SALD_Ano = D.CUEN_Ano) As DebeAcum,
(Select Sum(SALD_Haber) From SaldosCont Where SALD_Mes < @Mes And
CUEN_CodCta = D.CUEN_CodCta And SALD_Ano = D.CUEN_Ano) As HaberAcum,
Sum(D.DETV_Debe) As DebeMes, Sum(D.DETV_Haber) As HaberMes
From DetVoucher D
Where D.CABV_Ano = @Ano And D.CABV_Mes = @Mes And D.CUEN_CodCta Between
@CuentaIni And @CuentaFin
Group by D.CUEN_CodCta, D.CUEN_Ano
Union All
Select SC.CUEN_CodCta, Sum(SC.SALD_Debe), Sum(SC.SALD_Haber), 0, 0
From SaldosCont SC
Where SC.CUEN_CodCta Between @CuentaIni And @CuentaFin And SC.SALD_Ano =
@Ano And SC.SALD_Mes < @Mes
And (Select Count(*) From Cuentas Where SC.CUEN_CodCta = CUEN_CuentaPadre
And CUEN_CuentaPadre Is Not Null And
SC.SALD_Ano = CUEN_Ano) = 0
And SC.CUEN_CodCta Not In (Select Distinct CUEN_CodCta From DetVoucher
Where CUEN_CodCta Between @CuentaIni And @CuentaFin And CUEN_Ano = @Ano And
CABV_Mes = @Mes)
Group by SC.CUEN_CodCta) A Inner Join Cuentas C On A.CUEN_CodCta =
C.CUEN_CodCta And C.CUEN_Ano = @Ano
Order by A.CUEN_CodCta
 

Leer las respuestas

#1 Maxi
30/10/2006 - 16:53 | Informe spam
Hola, con esto poco de info es complicado ver q pasa, yo te recomendaria que
ejecutes ambos querys y nos pases el plan de ejecucion de ambos a ver que
esta sucediendo


Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"jcac" escribió en el mensaje
news:OD5XcID$
Hola lista estoy cambiando algunos sp que estan utilizando tablas
temporales, y probando en el query analizer su tiempo de respuesta y bueno
los sp con temporales se demoran mucho mas que los sp que he cambiado,
pero ahora cuando los ejecuto desde mi aplicativo estos me devyuelven
tiempo de espera el sp que no tiene temporales, en cambio el sp que si
tiene temporales que se demora mas no me devuelve tiempo de espera, les
adjunto el codigo de ambos sps

SP con Temporales

CREATE Procedure C_SALDSS_MayorAuxiliarSoles
@Ano char(4),
@Mes char(2),
@CuentaIni Cuenta,
@CuentaFin Cuenta
AS
Set Nocount On
SELECT Distinct D.CUEN_CodCta, C.CUEN_Desc, Convert(Decimal(12,2),0) AS
DebeAcum, Convert(Decimal(12,2),0) AS HaberAcum,
Convert(Decimal(12,2),0) AS DebeMes, Convert(Decimal(12,2),0) AS HaberMes,
Convert(Decimal(12,2),0) AS DebeResul,
Convert(Decimal(12,2),0) AS HaberResul, Convert(Decimal(12,2),0) AS
Deudor, Convert(Decimal(12,2),0) AS Acreedor
Into #Mayor
FROM DetVoucher D LEFT OUTER JOIN Cuentas C ON D.CUEN_ano = C.CUEN_ano AND
D.CUEN_CodCta = C.CUEN_CodCta
Where CABV_ano = @Ano and CABV_mes <= @Mes Order by D.Cuen_CodCta

Select CUEN_CodCta, sum(SALD_Debe) as Debe, sum(SALD_Haber) as Haber,
sum(SALD_DebeDol) as DebeDol,
sum(SALD_HaberDol) as HaberDol
Into #Inicial
From SaldosCont
Where SALD_Mes < @Mes and SALD_ano = @Ano
Group by CUEN_CodCta

Update #Mayor Set
DebeAcum = Debe ,
HaberAcum = Haber
From #Mayor M inner join #Inicial I on M.CUEN_CodCta = I.CUEN_CodCta

Update #Mayor Set
DebeMes = SALD_Debe,
HaberMes = SALD_Haber
From #Mayor M inner join SaldosCont I on M.CUEN_CodCta = I.CUEN_CodCta
Where I.SALD_Ano = @Ano and I.SALD_Mes = @Mes

Update #Mayor Set
DebeResul = DebeAcum + DebeMes,
HaberResul = HaberAcum + HaberMes

Update #Mayor Set
Deudor = Case When (DebeResul - HaberResul) > 0 then DebeResul -
HaberResul else 0 end,
Acreedor = Case When (HaberResul - DebeResul) > 0 then HaberResul -
DebeResul else 0 end

Select * from #Mayor Where CUEN_CodCta between @CuentaIni and @CuentaFin
Order by CUEN_CodCta
Set NoCount Off
/***************************************************/


SP sin Temporales

Create Procedure C_SALDSS_MayorAuxiliarSoles --
C_SALDSS_MayorAuxiliarSoles '2006', '09', '16', '16.9.99.99.99.99'
@Ano Char(4), @Mes Char(2), @CuentaIni Cuenta, @CuentaFin Cuenta
As
Select A.CUEN_CodCta, C.CUEN_Desc, A.DebeAcum, A.HaberAcum, A.DebeMes,
A.HaberMes, A.DebeAcum + A.DebeMes As DebeResul, A.HaberAcum + A.HaberMes
As HaberResul,
Case When (A.DebeAcum + A.DebeMes) - (A.HaberAcum + A.HaberMes) > 0 Then
(A.DebeAcum + A.DebeMes) - (A.HaberAcum + A.HaberMes) Else 0 End As
Deudor,
Case When (A.HaberAcum + A.HaberMes) - (A.DebeAcum + A.DebeMes) > 0 Then
(A.HaberAcum + A.HaberMes) - (A.DebeAcum + A.DebeMes) Else 0 End As
Acreedor
From (Select D.CUEN_CodCta,
(Select Sum(SALD_Debe) From SaldosCont Where SALD_Mes < @Mes And
CUEN_CodCta = D.CUEN_CodCta And SALD_Ano = D.CUEN_Ano) As DebeAcum,
(Select Sum(SALD_Haber) From SaldosCont Where SALD_Mes < @Mes And
CUEN_CodCta = D.CUEN_CodCta And SALD_Ano = D.CUEN_Ano) As HaberAcum,
Sum(D.DETV_Debe) As DebeMes, Sum(D.DETV_Haber) As HaberMes
From DetVoucher D
Where D.CABV_Ano = @Ano And D.CABV_Mes = @Mes And D.CUEN_CodCta Between
@CuentaIni And @CuentaFin
Group by D.CUEN_CodCta, D.CUEN_Ano
Union All
Select SC.CUEN_CodCta, Sum(SC.SALD_Debe), Sum(SC.SALD_Haber), 0, 0
From SaldosCont SC
Where SC.CUEN_CodCta Between @CuentaIni And @CuentaFin And SC.SALD_Ano =
@Ano And SC.SALD_Mes < @Mes
And (Select Count(*) From Cuentas Where SC.CUEN_CodCta = CUEN_CuentaPadre
And CUEN_CuentaPadre Is Not Null And
SC.SALD_Ano = CUEN_Ano) = 0
And SC.CUEN_CodCta Not In (Select Distinct CUEN_CodCta From DetVoucher
Where CUEN_CodCta Between @CuentaIni And @CuentaFin And CUEN_Ano = @Ano
And CABV_Mes = @Mes)
Group by SC.CUEN_CodCta) A Inner Join Cuentas C On A.CUEN_CodCta =
C.CUEN_CodCta And C.CUEN_Ano = @Ano
Order by A.CUEN_CodCta



Preguntas similares