sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo eliminar datos caducados de una tabla enorme sin que el archivo de registro se salga de control?

Lo he encontrado útil al hacer eliminaciones de la tabla con una gran cantidad de filas para eliminar filas en lotes de, digamos, 5000 o más (generalmente pruebo para ver qué valor funciona más rápido, a veces son 5000 filas, a veces 10,000, etc.) . Esto permite que cada operación de eliminación se complete rápidamente, en lugar de esperar mucho tiempo para que una declaración elimine 400 millones de registros.

En SQL Server 2005, algo como esto debería funcionar (prueba primero, por supuesto):

WHILE EXISTS ( SELECT * FROM giganticTable WHERE exp_date < getDate())
BEGIN
  DELETE TOP(5000) FROM giganticTable WHERE exp_date < getDate()
END

Vería qué hace la eliminación por lotes con el tamaño del archivo de registro. Si todavía está explotando los registros, puede intentar cambiar el modelo de recuperación a Simple , eliminando los registros y luego volviendo a cambiar a Bulk Logged, pero solo si el sistema puede tolerar la pérdida de algunos datos recientes. Definitivamente haría una copia de seguridad completa antes de intentar ese procedimiento. Este hilo también sugiere que podría configurar un trabajo para hacer una copia de seguridad de los registros con solo truncar especificado, por lo que podría ser otra opción. Es de esperar que tenga una instancia con la que pueda probar, pero comenzaría con las eliminaciones por lotes para ver cómo eso afecta el rendimiento y el tamaño del archivo de registro.