Estoy escribiendo un procedimiento para eliminar todas las filas de algunas tablas durante n días.Eliminar un gran número de filas de SQL Server - de manera eficiente y sin bloqueo
Una simple consulta muertos es fácil escribir
DELETE FROM [myTable]
WHERE [Created] < GETDATE()-30
Uno de los problemas es que no hay índice en el campo de la fecha - que podría añadir uno, pero yo estaba trabajando alrededor de ella haciendo algo como:
SELECT @var = MAX([ID]) FROM myTable WHERE Created < GETDATE()-30;
DELETE FROM myTable WHERE ID < @var
¿Parece un método aceptable?
El problema es que la tabla es enorme, y esta consulta borrará probablemente cientos de miles de filas en cada ejecución.
Al ejecutarlo en un servidor de prueba (un poco lento) tarda una hora más o menos, y elimina la tabla de otros procesos que intentan leer/escribir en ella.
No me molesta demasiado tomarse un tiempo para correr (aunque más rápido es mejor) - pero no puedo tenerlo bloqueando la mesa durante una hora mientras está en ejecución, ya que hay lecturas/escrituras constantes pasando (principalmente escribe).
Mi conocimiento de DB es bastante básico, ya que soy un codificador no un dba.
¿Puede alguien darme un método decente para realizar esta tarea, de la manera más eficiente posible?
¿Por qué no simplemente seleccionar los registros que va a eliminar en una tabla temporal, y luego crear un cursor para eliminar un par de registros de la tabla temporal en cada ejecución? Luego tiene muchas pequeñas instrucciones de eliminación que no deberían bloquear su tabla. – Tejs
Suelta la partición anterior. Si no tiene particiones, debe ver que ... – peufeu