update right linked hasta example charindex caracter sql-server sql-server-2005

sql-server - right - update openquery sql server



Eliminar los registros de SQL Server 2005 sin registro (7)

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

No deseo iniciar sesión porque, una vez eliminados, esos registros nunca volverán a ser necesarios.

Actualmente las diversas eliminaciones llevan demasiado tiempo. ¿Hay otras opciones para mejorar el rendimiento de las declaraciones de eliminación? No puedo usar Truncate ya que hay una cláusula donde es necesario.


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, es un trabajo mantener la consistencia 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 usa para hacer copias de seguridad y restauraciones en un punto en el tiempo de la base de datos, y se usa al duplicar entre dos servidores.

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

1) ¿Tiene algún desencadenador DELETE que se dispare en sus mesas? Si es así, eso podría ser una fuente de lentitud.

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

3) ¿Tiene muchas claves foráneas que están siendo revisadas? Por ejemplo, si tiene otra tabla que hace referencia a la tabla desde la que se está eliminando, el servidor de la base de datos comparará 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 alta carga de indexación en la tabla de la que está eliminando? Cada fila eliminada se corresponderá con una entrada en cada índice que se elimine también, así que sea prudente con el uso de los índices. ¿Sus índices se mantienen correctamente?

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 sentencia DELETE a una sentencia SELECT y vea si esa consulta se ejecuta rápidamente. Si no es así, debe optimizar su instrucción SELECT editándola, reestructurando sus tablas o agregando los índices apropiados. Luego cambia la declaración de nuevo a un BORRAR. El rendimiento debe mejorarse significativamente si la ejecución de la instrucción SELECT correspondiente mejora durante la optimización.

Si tiene un gran trabajo por lotes ejecutando una gran cantidad de eliminaciones en sus tablas, es posible que desee deshabilitar temporalmente sus activadores, o tal vez desee eliminar 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.


En primer lugar, tenga en cuenta que NO puede tener un registro de transacciones ... ¿qué sucede si pierde energía en el servidor mientras realiza una eliminación enorme? Esta información es necesaria para que SQL Server pueda realizar operaciones atómicas .

Sin embargo, lo que podría interesarle es el "modelo de recuperación". Lea este artículo en technet: http://technet.microsoft.com/en-us/library/ms189275.aspx


Es fácil:

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


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

¿Ha utilizado el perfilador de SQL para ver el plan de ejecución de las solicitudes? Si registra estas operaciones, puede utilizar el asistente de rendimiento para analizarlas y sugerir un nuevo índice.

Si realiza una gran cantidad de instrucciones de eliminación individuales (eliminar ... donde id = xxx), es mejor que cree una tabla temporal con todos los ID y se una a esta tabla temporal para tener una sola instrucción de eliminación.


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, debe considerar encontrar una manera de hacer la eliminación en lotes. En lugar de una única declaración de eliminación, y si tenía un PK entero 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


Si está eliminando una tabla completa, puede usar TRUNCATE TABLE, que solo registra las desasignaciones de la página en lugar de eliminar una entrada por cada fila. No tengo conocimiento de ninguna manera de hacer eliminaciones sin ningún tipo de registro de transacciones.


Solo intente eliminar los registros agregando estas declaraciones antes y después de las declaraciones de eliminación. traceon(610) y traceoff(610) . es así

dbcc traceon(610) --Your Delete Statement delete statement dbcc traceoff(610)