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

Optimizar o disminuir el tiempo de ejecución de un update

Estas en el tema de Optimizar o disminuir el tiempo de ejecución de un update en el foro de SQL Server en Foros del Web. Buenas Tardes. Mi situación es la siguiente, al ejecutar el siguiente update: update m set FechaMovimiento=I.Fecha_Proceso from Movimientos m inner join items i(nolock) on m.id_contrato=i.id_contrato ...
  #1 (permalink)  
Antiguo 04/07/2014, 15:56
 
Fecha de Ingreso: mayo-2012
Ubicación: Ecuador
Mensajes: 7
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta Optimizar o disminuir el tiempo de ejecución de un update

Buenas Tardes.

Mi situación es la siguiente, al ejecutar el siguiente update:

update m
set FechaMovimiento=I.Fecha_Proceso
from
Movimientos m inner join items i(nolock)
on m.id_contrato=i.id_contrato
and m.id_sobre=i.id_sobre
and m.id_item=i.id_item


Se demora mucho tiempo, de hecho ya va casi 2 días de ejecución y todavia no se termina.

Un dato importante es que las tablas que se estan uniendo tienen una gran cantidad de datos:

Movimientos:45,000.000 filas
Items: 60,000.000 filas

Me gustaria saber si existen formas, consejos o recomendaciones de como disminuir el tiempo al realizar el update.

Gracias de antemano por su ayuda y comentarios
  #2 (permalink)  
Antiguo 04/07/2014, 17:24
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

Primiero, NO ES RECOMENDABLE utilizar el NOLOCK

Segundo, debería verse algo asi:

Código SQL:
Ver original
  1. UPDATE Movimientos
  2.  SET FechaMovimiento = I.Fecha_Proceso
  3.  FROM
  4.  Movimientos m INNER JOIN items i(nolock)
  5.  ON m.id_contrato=i.id_contrato
  6.  AND m.id_sobre=i.id_sobre
  7.  AND m.id_item=i.id_item

Tercero: ¿Tienes INDICES en tus tablas?

Cuarto: Si vas a actualizar varios registros, te recomiendo que hagas un UPDATE controlado mediante SET ROWCOUNT xxx

Donde xxx, es el numero de registros a actualizar
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 06/07/2014, 11:53
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

Cocuerdo con lo que que iislas ha escrito.
Yo añadiria otro filtro-
Where M.FechaMovimiento = I.Fecha_Proceso
para evitar inecesarias actualizaciones, especialmente si intentas la recomendación de iislas sobre el Set RowCount.
Otros factores que influyen el rendimiento de esta instrucción:
1. M.FechaMovimiento es parte del Clustered Index?
2. La tabla Movimientos tiene triggers?
3. Cuantas filas hay en Movimientos ?
4. Verifica que la clausula On (del Join) es correcta y no crea productos cartesianos.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #4 (permalink)  
Antiguo 06/07/2014, 14:01
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

Cita:
Iniciado por iislas Ver Mensaje
Primiero, NO ES RECOMENDABLE utilizar el NOLOCK

Segundo, debería verse algo asi:

Código SQL:
Ver original
  1. UPDATE Movimientos
  2.  SET FechaMovimiento = I.Fecha_Proceso
  3.  FROM
  4.  Movimientos m INNER JOIN items i(nolock)
  5.  ON m.id_contrato=i.id_contrato
  6.  AND m.id_sobre=i.id_sobre
  7.  AND m.id_item=i.id_item

Tercero: ¿Tienes INDICES en tus tablas?

Cuarto: Si vas a actualizar varios registros, te recomiendo que hagas un UPDATE controlado mediante SET ROWCOUNT xxx

Donde xxx, es el numero de registros a actualizar
iislas, pediría que escribas una breve explicacion del por que evitar el uso del NOLOCK en la query.

Gracias

damimg
  #5 (permalink)  
Antiguo 06/07/2014, 14:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

La query es un UPDATE, y conforme el manual de referencia oficial (http://msdn.microsoft.com/es-AR/library/ms187373.aspx) cláusulas NOLOCK y READUNCOMMITTED no se deben usar en queries de tipo INSERT, UPDATE y DELETE:
Cita:
No se pueden especificar READUNCOMMITTED ni NOLOCK en tablas modificadas por operaciones de inserción, actualización y eliminación. El optimizador de consultas de SQL Server omite las sugerencias READUNCOMMITTED y NOLOCK de la cláusula FROM que se aplica a la tabla de destino de una instrucción UPDATE o DELETE.
En el mismo manual hay una interesante nota destacada que dice:
Cita:
En una versión futura de SQL Server se quitará el uso de las sugerencias READUNCOMMITTED y NOLOCK en la cláusula FROM que se aplican a la tabla de destino de una instrucción UPDATE o DELETE. Evite usar estas sugerencias en este contexto en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que las usan actualmente.
Por lo demás, haceun un UPDATE masivo de una base en caliente, me parece algo extremadamente peligroso, que en todos los DBMS se desaconseja. Es preferible hacerlo off-line.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 06/07/2014, 17:28
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La query es un UPDATE, y conforme el manual de referencia oficial (http://msdn.microsoft.com/es-AR/library/ms187373.aspx) cláusulas NOLOCK y READUNCOMMITTED no se deben usar en queries de tipo INSERT, UPDATE y DELETE:

En el mismo manual hay una interesante nota destacada que dice:

Por lo demás, haceu un UPDATE masivo de una base en caliente, me parece algo extremadamente peligroso, que en todos los DBMS se desaconseja. Es preferible hacerlo off-line.
Excelente respuesta gnzsoloyo, por determinación de Microsoft la instrucción NOLOCK no debe utilizarse en operaciones del tipo DML en SQL Server 2008.+
En mi experiencia profesional, en cuanto a UPDATE MASIVOS de tablas con millones de registros, me uno a la recomendación de gnzsoloyo, se debe deshabilitar temporalmente la base (modo offline) y luego realizar el UPDATE.

En el caso que no se puede desconectar la DB se deberá realizar un UPDATE SEGMENTADO, es decir, dividiendo el total de los registros a actualizar en porciones iguales para hacer un uso más óptimo del DBMS.

Saludos a la comunidad.

damimg
DBA Specialist
  #7 (permalink)  
Antiguo 06/07/2014, 22:22
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

Por supuesto:
Código SQL:
Ver original
  1. WHERE (M.FechaMovimiento <> I.Fecha_Proceso OR M.FechaMovimiento IS NULL)
(y no lo que he escrito)
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 07/07/2014, 08:26
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Optimizar o disminuir el tiempo de ejecución de un update

Estoy en desacuerdo con gnzsoloyo y con damimg de que no se "debe de hace run update masivo" con la base de datos online, entonces como operan las grandes empresas bancarias? dan de baja las bases de datos cuando se hacen los updates de las cuentas?? todo eso se hace en horas donde la base de datos tiene poca utilizacion pero no se tiene porque dejar aislada......ademas con una buena optimizacion de querys, indices y demas se pueden hacer updates de millones de registros en poco tiempo(experiencia profesional)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: sql, update
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 00:42.