Estoy escribiendo un proceso que archiva las filas de una tabla de SQL Server basada en una columna de fecha y hora. Quiero mover todas las filas con una fecha anterior a X, pero el problema es que hay millones de filas para cada fecha, por lo que hacer BEGIN TRANSACTION ... INSERTAR ... ELIMINAR ... COMPROMETER para cada fecha lleva demasiado tiempo y bloquea la base de datos para otros usuarios.Mover datos de SQL Server en fragmentos limitados (1000 filas)
¿Hay alguna manera de hacerlo en pedazos más pequeños? Tal vez usando ROWCOUNT o algo así?
me gustaría originalmente considerados algo así:
SET ROWCOUNT 1000
DECLARE @RowsLeft DATETIME
DECLARE @ArchiveDate DATETIME
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
WHILE @ROWSLEFT IS NOT NULL
BEGIN
INSERT INTO EventsBackups
SELECT top 1000 * FROM Events
DELETE Events
SET @ROWSLEFT = (SELECT TOP 1 dtcol FROM Events WHERE dtcol <= @ArchiveDate)
END
Pero entonces me di cuenta de que yo no puedo garantizar que las filas que estoy borrando son los que acabo de copia de seguridad. ¿O puedo ...?
ACTUALIZACIÓN: Otra de las opciones que había considerado fue la adición de un paso:
- SELECT TOP 1000 filas que cumplen mis criterios de fecha en una tabla temporal
- iniciar la transacción
- Insertar temp tabla en la tabla de archivos
- Eliminar de la tabla fuente, unir a la tabla temporal en cada columna
- Commit transa cción
- Repetir 1-5 hasta que no quedan filas que cumplan los criterios de fecha
¿Alguien tiene una idea de cómo el gasto de esta serie podría comparar con algunas de las otras opciones que se mencionan a continuación?
DETALLE: Estoy usando SQL 2005, ya que alguien me preguntó.
las cláusulas OUTPUT e INTO son su amigo, búsquelas o vea mi respuesta ... –