2011-05-26 16 views
6

Si trato de eliminar un brunch de datos de una tabla. digaWill Delete SQL bloquea la tabla que impide la inserción de datos nuevos en SQL Server 2005?

DELETE FROM myTable Where CreationDate < GetDate() 

que tarda horas en eliminarse, ¿se bloqueará esta tabla y no se podrá insertar?

Esta tabla no se autorefiere a sí misma. Asumiría que todavía puedo insertar nuevos datos mientras está borrando. ¿Eliminará SQL el bloqueo exclusivo que impide el acceso a la tabla?

Gracias

+0

eliminado mi respuesta - He leído demasiado rápido y supuse que estábamos hablando de '' SELECT' durante una DELETE'. – JNK

Respuesta

9

Usted puede tratar por ellos para evitar que se bloqueen toda la tabla:

WHILE 1 = 1 
    BEGIN 
     DELETE TOP 10000 FROM myTable WHERE CreationDate < GetDate() 

     IF @@ROWCOUNT = 0 
      BREAK 
    END 
+1

Las filas de 10K escalarán al bloqueo de la tabla. Manténgalo por debajo de 5K para evitar esto. –

+4

El número de bloqueos necesarios para una escalada no es estrictamente 5K. Hay muchos otros factores a su alrededor. A continuación, hace un buen trabajo explicando SQL 2005: http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/05/17/lock-escalation.aspx –

+3

Lo más importante es tener un índice en CreationDate. Sin embargo, se requiere una exploración de tabla para cada lote. –

0

Hay muchas cosas que podrían cambiar este comportamiento. Sin embargo, si se refiere a muchos más de 5K registros de lo que probablemente se bloqueará. Puede evitar esto usando lotes más pequeños o especificando un nivel de aislamiento que no se bloqueará.

+2

No puede "especificar un nivel de aislamiento que no se bloqueará". ya que el OP está preguntando sobre 'eliminar' e 'insertar'. Estos siempre tomarán bloqueos. –

Cuestiones relacionadas