Ayuda : El Store Procedure es mas lento que el TSQL

10/06/2004 - 02:30 por silverchpc | Informe spam
Amigos ayuda porfa que no entiendo el porque de esto:

Si ejecuto esto desde el Query Analizer demora 0.23 segundos

Exec ('UPDATE a SET a.npDiasLaborados = isnull((select
Sum(b.npDiasTrabajados) from NominaProcesada b where b.npCodigo
=a.npCodigo and b.npEmpresa = a.npEmpresa and b.PeriodoAnoa.PeriodoAno and b.PeriodoMes = a.PeriodoMes and b.npTrabajo IN
(''01'',''02'',''04'',''05'',''12'') group by b.npCodigo),0) From
NominaProcesada a where a.npTrabajo =''16'' and a.npFecha=''20040501''
and a.npEmpresa=''06''')

Pero al Usar un Store Procedure Demora mas de 20 minutos !!!!!!
CREATE PROCEDURE sp_ejecutaformula1x1Prueba
@Empresa CHAR(2),
@Trabajo CHAR(2),
@Campo VARCHAR(30),
@Transaccion INT,
@Formula VARCHAR(3000),
@Fecha CHAR(8),
@FechaFin CHAR(8),
@Salida VARCHAR(100) OUTPUT
AS
DECLARE @SP VARCHAR(1000)
DECLARE @Errores VARCHAR(100)

SET @Errores = ''

IF dbo.INSTR(UPPER(@Formula),'@SQL',1) > 0 /*Para los SQL*/
BEGIN
SET @SP = SUBSTRING(@Formula,6,LEN(@Formula)-6)
PRINT @SP
EXEC (@SP) /* Aca se DEMORA UNA ETERNIDAD */
IF (@@Error <> 0) GOTO ERROR_EJECUTAFORMULA
END

FIN:
SET @Salida = @Errores
RETURN

ERROR_EJECUTAFORMULA:
SET @Errores = @Campo + ':' + @Formula
GOTO FIN
GO

Lineas para llamar al SP desde el SQLQA:

declare @Salida varchar(200)
declare @Formula varchar(3000)
set @Formula = '@Sql(UPDATE a SET a.npDiasLaborados = isnull((select
Sum(b.npDiasTrabajados) from NominaProcesada b where b.npCodigo
=a.npCodigo and b.npEmpresa = a.npEmpresa and b.PeriodoAnoa.PeriodoAno and b.PeriodoMes = a.PeriodoMes and b.npTrabajo IN
(''01'',''02'',''04'',''05'',''12'') group by b.npCodigo),0) From
NominaProcesada a where a.npTrabajo =''16'' and a.npFecha=''20040501''
and a.npEmpresa=''06'')'
exec sp_ejecutaformula1x1Prueba
'06','16','npDiasLaborados',0,@Formula,'20040501','20040531',@Salida
print @salida

No se que pasa? sera problema de indices, porque la linea sola si
trabaja rapido?, se puede forzar al uso de un indice?. Ayuda

Gracias Xtian.
 

Leer las respuestas

#1 Gregorio López Rojo
10/06/2004 - 02:53 | Informe spam
En el stored procedure estás ejecutando sql dinámico y para cuestiones de
rendimiento no esto se recomienda.
Desconozco lo que en realidad haría el stored procedure, pero si quieres
rapidez tu stored procedure debería estar diseñado algo así:
CREATE PROCEDURE sp_X
@Empresa CHAR(2),
@Trabajo CHAR(2),
@Fecha CHAR(8)
AS
UPDATE a
SET a.npDiasLaborados = ISNULL((SELECT
SUM(b.npDiasTrabajados)
FROM NominaProcesada b
WHERE b.npCodigo = a.npCodigo AND
b.npEmpresa = a.npEmpresa AND
b.PeriodoAno= a.PeriodoAno AND
b.PeriodoMes = a.PeriodoMes AND
b.npTrabajo IN (''01'',''02'',''04'',''05'',''12'')
GROUP BY b.npCodigo),0)
FROM NominaProcesada a
WHERE a.npTrabajo = @Trabajo AND a.npFecha=@Fecha
AND a.npEmpresa = @Empresa

Saludos.

"Xtian" wrote in message
news:
Amigos ayuda porfa que no entiendo el porque de esto:

Si ejecuto esto desde el Query Analizer demora 0.23 segundos

Exec ('UPDATE a SET a.npDiasLaborados = isnull((select
Sum(b.npDiasTrabajados) from NominaProcesada b where b.npCodigo
=a.npCodigo and b.npEmpresa = a.npEmpresa and b.PeriodoAno> a.PeriodoAno and b.PeriodoMes = a.PeriodoMes and b.npTrabajo IN
(''01'',''02'',''04'',''05'',''12'') group by b.npCodigo),0) From
NominaProcesada a where a.npTrabajo =''16'' and a.npFecha=''20040501''
and a.npEmpresa=''06''')

Pero al Usar un Store Procedure Demora mas de 20 minutos !!!!!!
CREATE PROCEDURE sp_ejecutaformula1x1Prueba
@Empresa CHAR(2),
@Trabajo CHAR(2),
@Campo VARCHAR(30),
@Transaccion INT,
@Formula VARCHAR(3000),
@Fecha CHAR(8),
@FechaFin CHAR(8),
@Salida VARCHAR(100) OUTPUT
AS
DECLARE @SP VARCHAR(1000)
DECLARE @Errores VARCHAR(100)

SET @Errores = ''

IF dbo.INSTR(UPPER(@Formula),'@SQL',1) > 0 /*Para los SQL*/
BEGIN
SET @SP = SUBSTRING(@Formula,6,LEN(@Formula)-6)
PRINT @SP
EXEC (@SP) /* Aca se DEMORA UNA ETERNIDAD */
IF (@@Error <> 0) GOTO ERROR_EJECUTAFORMULA
END

FIN:
SET @Salida = @Errores
RETURN

ERROR_EJECUTAFORMULA:
SET @Errores = @Campo + ':' + @Formula
GOTO FIN
GO

Lineas para llamar al SP desde el SQLQA:

declare @Salida varchar(200)
declare @Formula varchar(3000)
set @Formula = '@Sql(UPDATE a SET a.npDiasLaborados = isnull((select
Sum(b.npDiasTrabajados) from NominaProcesada b where b.npCodigo
=a.npCodigo and b.npEmpresa = a.npEmpresa and b.PeriodoAno> a.PeriodoAno and b.PeriodoMes = a.PeriodoMes and b.npTrabajo IN
(''01'',''02'',''04'',''05'',''12'') group by b.npCodigo),0) From
NominaProcesada a where a.npTrabajo =''16'' and a.npFecha=''20040501''
and a.npEmpresa=''06'')'
exec sp_ejecutaformula1x1Prueba
'06','16','npDiasLaborados',0,@Formula,'20040501','20040531',@Salida
print @salida

No se que pasa? sera problema de indices, porque la linea sola si
trabaja rapido?, se puede forzar al uso de un indice?. Ayuda

Gracias Xtian.

Preguntas similares