2010-03-05 16 views
16

Cómo eliminar registros de las tablas de SQL Server 2005 sin iniciar sesión en los registros de transacciones.Eliminar registros de SQL Server 2005 sin iniciar sesión

No deseo iniciar sesión porque una vez eliminados, esos registros ya no serán necesarios nuevamente.

Actualmente, las diversas eliminaciones toman demasiado tiempo. ¿Hay alguna otra opción para mejorar el rendimiento de las instrucciones de eliminación? No puedo usar truncado ya que hay una cláusula WHERE necesaria.

+1

Hmm, interesante ... ¿guarda más de lo que está eliminando? ¿O menos? –

+0

No lo sé. Pero en la mayoría de los casos, guardo menos y elimino más. Los registros que se eliminarán son demasiados en números y en muchas tablas. De hecho, es para una rutina de purga. –

+2

En ese caso, podría ser interesante ver si puede insertar el "para mantener" en una tabla temporal, truncar la tabla principal e insertarla de nuevo en la principal. (Puede que necesite hacer algunas cosas extrañas para mantener las identidades, etc., pero podría valer la pena intentarlo, pero sospecho que alguien puede tener una mejor idea). –

Respuesta

1

Antes que nada, tenga en cuenta que NO puede tener un registro de transacciones ... ¿Qué pasa si pierde energía en el servidor mientras realiza una eliminación enorme? Esta información es necesaria para SQL Server puede realizar atomic operations ..

Lo que podría ser de interés para usted, aunque es "modelo de recuperación” Por favor, lea este artículo en TechNet:. http://technet.microsoft.com/en-us/library/ms189275.aspx

4

Si va a eliminar toda una tabla que podría usar TRUNCATE TABLE, que solo registra las desasignaciones de página en lugar de tener una entrada para cada fila eliminada. No conozco ninguna forma de hacer eliminaciones sin ningún registro de transacción.

+3

'TRUNCATE TABLE' elimina * todos * registros de la tabla –

+0

¿Entonces? Los que aún se necesitan se pueden almacenar en una tabla temporal;) Luego se movieron de vuelta a la mesa ahora vacía. – TomTom

+0

La tabla truncada no funcionará si la tabla tiene restricciones de clave externa. – Marques

0

Está borrando cosas, pero tiene una cláusula where, por lo que se aplican las recomendaciones de rendimiento habituales sobre SQL.

¿Ha utilizado el generador de perfiles SQL para ver el plan de ejecución de las solicitudes? Si registra estas operaciones, puede usar el asistente de rendimiento para analizarlas y quizás sugerir un nuevo índice.

Si realiza una gran cantidad de instrucciones de eliminación individuales (eliminar ... donde id = xxx), puede ser mejor crear una tabla temporal con todos los ID y unirse a esta tabla temporal para tener una sola declaración de eliminación.

6

Creo que está confundiendo el concepto de un registro de transacciones en la base de datos. La función principal del registro de transacciones no es para restaurar filas antiguas; su trabajo es mantener la coherencia de la base de datos. Todas las modificaciones pasan por el registro de transacciones y no hay forma de evitarlo. Eso es bueno. Un registro de transacciones también se utiliza para hacer copias de seguridad y restauraciones puntuales de la base de datos, y se usa cuando se duplican dos servidores.

Si tiene eliminaciones que toman demasiado tiempo, primero debe buscar en un par de áreas.

1) ¿Tiene algún desencadenador DELETE que esté disparando en sus tablas? Si es así, podrían ser una fuente de lentitud.

2) ¿Ha configurado correctamente su DBA la base de datos, al mínimo, manteniendo el registro de transacciones y los archivos de datos en discos físicos separados?

3) ¿Tiene muchas llaves foráneas que se revisan? Por ejemplo, si tiene otra tabla que hace referencia a la tabla desde la que está eliminando, el servidor de la base de datos verificará cada eliminación con las tablas de referencia para asegurarse de que la declaración de eliminación no haga que esas otras tablas se vuelvan inconsistentes.

4) ¿Tiene demasiados índices o una carga de indexación demasiado alta en la tabla desde la que está eliminando? Cada fila eliminada corresponderá a una entrada en cada índice que se eliminará también, así que sea prudente sobre el uso que haga de los índices. ¿Están sus índices correctamente mantenidos?

5) ¿Lleva mucho tiempo buscar las filas que desea eliminar? Si la cláusula WHERE en su declaración DELETE es demasiado costosa, esto realmente ralentizará sus eliminaciones.Intente cambiar temporalmente su declaración DELETE a una instrucción SELECT y vea si esa consulta se ejecuta rápidamente. Si no es así, debe optimizar su declaración SELECT ya sea editándola, reestructurando sus tablas o añadiendo los índices apropiados. Luego, cambie la declaración a DELETE. El rendimiento debería mejorarse significativamente si la ejecución de su declaración SELECT correspondiente mejora durante su optimización.

Si tiene un gran trabajo por lotes ejecutando una gran cantidad de eliminaciones en sus tablas, es posible que desee desactivar temporalmente sus desencadenadores, o puede desear soltar y volver a crear sus índices y claves externas después de estos grandes lotes de eliminación. Eso también podría acelerar las cosas.

4

Olvide el registro de transacciones como una fuente de la velocidad o cualquier otra cosa que no sea algo utilizado internamente por el DB para mantener la coherencia. En su lugar, debería considerar encontrar la manera de hacer la eliminación en lotes. En lugar de una sola declaración de eliminación, y si tenía una PK entera en la tabla, intente eliminar rangos de valores y haga esto en un bucle. Así que algo como

Declare @RecordsLeft int 
Declare @StartRange int 
Declare @EndRange int 
Declare @BatchSize int 

Set @BatchSize = 10000 
Set @RecordsLeft = (Select Count(*) From ...) 
Set @StartRange = 0 
Set @EndRange = @StartRange + @BatchSize 

While @RecordsLeft > 0 
Begin 
    Delete ... 
    Where ... 
     And PK Between @StartRange And @EndRange 

    Set @RecordsLeft = (Select Count(*) From ...) 
    Set @StartRange = @EndRange + 1 
    Set @EndRange = @StartRange + @BatchSize 
End 
+0

Su funcionamiento. Gracias. – fkucukbaltaci

16

Es fácil:

DECLARE @BatchSize INT 
SET @BatchSize = 100000 

WHILE @BatchSize <> 0 
BEGIN 
    DELETE TOP (@BatchSize) 
    FROM [dbo].[UnknownTable] 
    SET @BatchSize = @@rowcount 
END 
+0

buena solución en caso de que no tenga permisos TRUNCATE TABLE, ¡gracias! –

+0

¿Alguien puede confirmar (o refutar) que se trata de una solución ** real **? Soy muy escéptico de esto, no creo que 'TOP' deje de grabar cada registro eliminado ... – MarioDS

+0

Aquí - http://dba.stackexchange.com/a/1751 es la misma solución pero un poco más compacta – sarh

2

sólo tratar de eliminar los registros mediante la adición de estas declaraciones antes y después de las instrucciones delete. traceon(610) y traceoff(610). es así

dbcc traceon(610) 

--Your Delete Statement 
delete statement 


dbcc traceoff(610) 
+0

Parece que el indicador de traza 610 no es relevante para sql 2005. La instrucción "funciona" sin falla, pero sin resultado. – sarh

Cuestiones relacionadas