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:

  1. 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.
  2. 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)
  3. (EDIT) No puedo modificar nada, excepto los datos.
  4. (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
¿Fue útil?

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:

  1. Usted puede ampliar su registro de transacciones a cualquier tamaño que desee por lo que no lo llena.
  2. Si su registro de transacciones crece demasiado siempre se puede copia de seguridad de su base de datos y truncar el registro.
  3. Se puede trabajar a través de los datos en lotes (hacer un millón a la vez)
  4. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top