Problemas con stored procedure

Me encuentro con el siguiente problema tengo un sistema donde ejecuto un stored procedure que ingresa datos en la base sql server 2005, ahora la gente que esta implementando el sistema me dice que el store le bloquea las demás base o sea hasta que el store no se cierre ellos no pueden agregar u borrar datos en otras bases que están en ese mismo servidor sql. Quería saber si esto es así por que enunca escuche esto y si es así como puedo solucionarlo.

2 respuestas

Respuesta
1
Acá hay que identificar dos cosas:
- Si el sp no interactúa con las demás bases de datos no tiene porque bloquear otra base de datos, eso no es correcto.
- Si el sp interactura a través de un linked server, o invoca paquetes que se resuelven en otras db puede darse el caso.
Esta en ti que conoces la estructura de tu sp determinar si llama a otra bd o no.
Puedes correr el sp y correr el comando sp_who active y ver el SPID de tu proceso y determinar que esta bloqueando.
Yo tengo un stored procedure que toma datos y los ingresa en una tabla acá te lo paso.
CREATE PROCEDURE [dbo].[sp_cargar_depositoSUSS]
AS
begin
 SET NOCOUNT ON;
 SET DATEFORMAT YMD;
/* Se carga el lote en la tabla AFIP, que tiene los mismos campos
-Completo, aunque no se utilicen todos-. Se inserta en la tabla
depositoSUSS la suma total por aseguradora de aquellas entradas de
tipo 'C' (crédito) menos las de tipo 'D' (débito). Se agrupa por
fecha de transferencia, período correspondiente y aseguradora. ¿Se
verifica la relación entre empleador y aseguradora a la fecha de
transferencia?... ¿Período pagado? Asumimos este último. Si existe
fecha de baja, estimamos el corte a una fecha -en principio tomamos
el 15 de cada mes */
 INSERT INTO depositoSUSS
SELECT newid(), aseguradora.idAseguradora, FECPROC,
 CASE WHEN PERIODO >= 8000
     THEN   
      '19' + substring(PERIODO, 1, 2)
     ELSE
      '20' + substring(PERIODO, 1, 2)
     END as anio,
    substring(PERIODO, 3, 4),
              sum(CASE
                          WHEN INDDBCR LIKE 'C' 
  THEN cast(substring(importe, 1, 13) + '.' + substring(importe, 14, 15) as money)
                           ELSE  cast('-' + substring(importe, 1, 13) + '.' + substring(importe, 14, 15) as money)
                      END)   
FROM AFIP INNER JOIN
                      empleador ON AFIP.CUITCONT = empleador.cuit
INNER JOIN
                      aseguradora_empleador ON convert(nvarchar(400), empleador.idEmpleador) = aseguradora_empleador.idEmpleador
INNER JOIN
                      aseguradora ON aseguradora_empleador.idAseguradora = convert(nvarchar(400), aseguradora.idAseguradora)
WHERE    (PERIODO >= 8000
     AND (('19' + PERIODO > DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta))
     OR  ('19' + PERIODO = DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta))
         AND (DATEPART(day, aseguradora_empleador.fechaAlta) < 14)
         ) 
      AND ( aseguradora_empleador.fechaBaja IS NULL
             OR aseguradora_empleador.fechaBaja >= convert(datetime,('15/' + substring(PERIODO, 3, 4) + '/19' + substring(PERIODO, 1, 2)),103)
           )
 ) 
 OR
        (PERIODO < 8000
   AND ( ('20' + PERIODO > DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta))
          OR  ('20' + PERIODO = DATEPART(year, aseguradora_empleador.fechaAlta) + DATEPART(month, aseguradora_empleador.fechaAlta))
          AND (DATEPART(day, aseguradora_empleador.fechaAlta) < 14)
    ) 
   AND (aseguradora_empleador.fechaBaja IS NULL
          OR aseguradora_empleador.fechaBaja >= convert(datetime,('15/' + substring(PERIODO, 3, 4) + '/20' + substring(PERIODO, 1, 2)),103)
      )
 ) 
GROUP BY aseguradora.idAseguradora, FECPROC, PERIODO
-- DELETE DE LA TABLA AFIP
END
GO
La gente que esta implementando el sistema me dice que al ejecutar el stored, hasta que este no termine deja en espera los demás stored, ya sea como agregar o borrar pero no solo los stored de esta base sino de las otras bases que se encuentran en este servidor, este stored no interactúa con las demás bases.
¿Aun sigues con este problema?
He tenido mucho trabajo por lo que no he podido contestar.
Respuesta
1
Esto puede pasar por varias razones
1. La conexión en que ejecutas el sp no permite conexiones
2. El sp procesa demasiados datos y bloquea el sql server, no dejando procesar las demás peticiones
3. La memoria reservada el sql server no es suficiente (tendrías que cambiar los valores que vienen por default) y ampliarlos a tus necesidades
Tendrías que depurar las operaciones que realiza el sp y revisar las conexión si la abre como optimistic o pessimistic así como también las opciones del cursor.
Otra podría ser que si abre querys (SELECT) añadir la opción WITH (NOLOCK) por cada tabla que se consulta, esto en ocasiones provoca bloqueos en otras consultas
Para finalizar tendrías que ejecutar un "ejecution plan" para ver en que parte tiene más tiempo de proceso y realizar una depuración de tu sp, para esto hay varias maneras, creando indices, trabajar con tablas temporales, crear vistas... etc., hay varias opciones pero tienes que determinar en que parte y/o porque se esta colgando el proceso del servidor.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas