Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Mejorar el SP, para actualizar si existe un registro, sino insertar

Estas en el tema de Mejorar el SP, para actualizar si existe un registro, sino insertar en el foro de SQL Server en Foros del Web. Hola amigos, tengo este SP que me funciona bien, pero el tema es que me dijeron que no es performance y que debo mejorarlo. Ya ...
  #1 (permalink)  
Antiguo 28/01/2016, 10:08
 
Fecha de Ingreso: noviembre-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Mejorar el SP, para actualizar si existe un registro, sino insertar

Hola amigos, tengo este SP que me funciona bien, pero el tema es que me dijeron que no es performance y que debo mejorarlo.
Ya lo revisé y no le encuentro la vuelta, me pueden ayudar cómo debo mejorarlo.
La idea de este SP es si un Aula o Curso no tiene un horario definido entonces realizar un insert o de lo contrario update.

Código SQL:
Ver original
  1. CREATE PROCEDURE HORARIO_AULA_ACTUALIZAR_INSERTAR
  2. @Aula_Id INT,
  3. @Lunes BIT,
  4. @Martes BIT,
  5. @Miercoles BIT,
  6. @Jueves BIT,
  7. @Viernes BIT,
  8. @HoraDesde DATETIME,
  9. @HoraHasta DATETIME
  10. AS
  11. BEGIN
  12.     IF ((SELECT COUNT(hc.Id) FROM HORARIO_AULA ha WHERE ha.Aula_id =     @Aula_Id ANDha.Activo = 1) > 0)
  13.     BEGIN
  14.         UPDATE HORARIO_AULA SET
  15.                Lunes = @Lunes
  16.               ,Martes = @Martes
  17.               ,Miercoles = @Miercoles
  18.               ,Jueves = @Jueves
  19.               ,Viernes = @Viernes
  20.               ,Sabado = @Sabado
  21.               ,HoraDesde = @HoraDesde
  22.               ,HoraHasta = @HoraHasta
  23.          WHERE Aula_Id = @Aula_Id AND
  24.                Activo = 1
  25.     END
  26.     ELSE
  27.     BEGIN
  28.         DECLARE @Maximo_Id BIGINT
  29.         SELECT @Maximo_Id = ISNULL((COUNT(Id)+1), 1) FROM HORARIO_AULA
  30.        
  31.         INSERT INTO HORARIO_AULA (Id, Aula_Id, Lunes, Martes, Miercoles,   Jueves, Viernes, HoraDesde, HoraHasta, Activo)
  32.                                
  33.         VALUES (@Maximo_Id, @Aula_Id, @Domingo, @Lunes, @Martes, @Miercoles, @Jueves,  @Viernes, @HoraDesde, @HoraHasta, 1)
  34.     END
  35. END

Saludos,
  #2 (permalink)  
Antiguo 28/01/2016, 10:11
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Mejorar el SP, para actualizar si existe un registro, sino insertar

Asi rapido lo unico que veo es que en la tabla de horario_aula tienes un proceso para asignar el maximo id, lo que te evitarias si usaras un campo identity en lugar de hacer eso, digo lo unico que haces es manejar un autonumerico.

Por otro lado cual es el plan de ejecucion de estos querys? quizas el performance vaya por el lado de indices, pero eso no se puede saber sin mostrar el plan, y otra cosa, este procedure como lo mandas llamar y cuantas veces se manda llamar???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 28/01/2016, 10:12
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 9 meses
Puntos: 606
Respuesta: Mejorar el SP, para actualizar si existe un registro, sino insertar

En SQL Server tienes la versión Merge que te hace eso mismo (insert si no existe el registro y sino un update).
__________________
Aviso: No se resuelven dudas por MP!
  #4 (permalink)  
Antiguo 28/01/2016, 10:14
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Mejorar el SP, para actualizar si existe un registro, sino insertar

usando merge o un update insert es lo mismo te maneja las mismas operaciones en ambos lados, solo que en un lado manejas menos codigo que en otro......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 28/01/2016, 11:41
 
Fecha de Ingreso: agosto-2010
Mensajes: 126
Antigüedad: 14 años, 3 meses
Puntos: 9
Respuesta: Mejorar el SP, para actualizar si existe un registro, sino insertar

Puede ocurrir un error de duplicate key al insertar en la tabla HORARIO_AULA si justo al momento de obtener el @Maximo_Id otro proceso obtiene el mismo Id.
  #6 (permalink)  
Antiguo 28/01/2016, 12:47
 
Fecha de Ingreso: noviembre-2015
Ubicación: Buenos Aires
Mensajes: 3
Antigüedad: 9 años
Puntos: 0
Respuesta: Mejorar el SP, para actualizar si existe un registro, sino insertar

Gracias por sus respuestas, voy a hacer la modificación y utilizar un autoincremental para el campo Id, no tengo plan de ejecución, ahora estoy investigando Merge en sql.
  #7 (permalink)  
Antiguo 28/01/2016, 12:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Mejorar el SP, para actualizar si existe un registro, sino insertar

Como que no tienes plan de ejecucion? el plan de ejecucion lo genera sql server, asi que una cosa es que no sepas que es eso y otra muy distinta que no tengas, para el merge que version de sql server tienes?

el plan de ejecucion lo puedes obtener ejecutando tu procedure o tu query con "ctrl+L"
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: mejorar, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:23.