Actualización de consulta en millones de filas llena el registro de transacciones
-
28-09-2019 - |
Pregunta
Es necesario que actualice millones de filas como parte de mi próxima versión, pero al hacerlo se llena el registro de transacciones y falla. Tengo algunas ideas pero no soy un experto en SQL, así que estoy seguro de que habrá trampas que yo no sepa.
puntos pertinentes:
- Necesito a mano sobre un guión al equipo de operaciones por lo que necesita un método de T-SQL sin intervención manual.
- Al parecer, el registro de transacciones se recicla cada 15 minutos. (He pensado en escribir un bucle con un try-catch con
WAITFOR DELAY '00:15:00'
en el bloque catch, como a continuación) - (EDIT) No puedo modificar nada, excepto los datos.
- (EDIT) Es una simple actualización de cambiar una columna de clave externa a una clave existente diferente.
Gracias,
Phil
DECLARE
@AffectedRows int
SET @AffectedRows = 0
WHILE @AffectedRows < @RowsToUpdate
BEGIN
BEGIN TRY
BEGIN TRAN
-- Do some updates
SET @AffectedRows = @AffectedRows + @@RowCount
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
WAITFOR DELAY '00:15:00'
END CATCH
END
PRINT @AffectedRows
Solución
Al final, el ejemplo que ya había escrito funcionó mejor; un error completo registro de transacciones se ve atrapado en la captura y 15 minutos es tiempo suficiente para que el registro para ser reciclado.
DECLARE
@AffectedRows int
SET @AffectedRows = 0
WHILE @AffectedRows < @RowsToUpdate
BEGIN
BEGIN TRY
BEGIN TRAN
-- Do some updates
SET @AffectedRows = @AffectedRows + @@RowCount
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
WAITFOR DELAY '00:15:00'
END CATCH
END
PRINT @AffectedRows
Otros consejos
A los pocos puntos / ideas:
- Usted puede ampliar su registro de transacciones a cualquier tamaño que desee por lo que no lo llena.
- Si su registro de transacciones crece demasiado siempre se puede copia de seguridad de su base de datos y truncar el registro.
- Se puede trabajar a través de los datos en lotes (hacer un millón a la vez)
- Usted puede copiar los datos en una mesa de trabajo y luego sp_rename en cuando el procesamiento se realiza.
Esta reinventar mordisqueando eliminaciones / actualizaciones:)
Tome un vistazo a este enfoque, se puede hacer bloques más grandes que una sola fila:
http://www.sqlservervideos.com/video/nibbling-deletes/
http://sqladvice.com/blogs/repeatableread /archive/2005/09/20/12795.aspx