2011-05-26 1 views
6

Si j'essaie de supprimer un brunch de données d'une table. direWill Delete SQL verrouille la table qui empêche l'insertion de nouvelles données dans SQL Server 2005?

DELETE FROM myTable Where CreationDate < GetDate() 

qui prend des heures à supprimer, ce tableau sera verrouillé et aucun nouvel insert peut-il passé?

Cette table ne se référence pas automatiquement. Je suppose que je peux toujours insérer de nouvelles données pendant la suppression. Le delete sql utilisera-t-il un verrou exclusif qui empêche tout accès à la table?

Merci

+0

supprimé ma réponse - je lis trop vite, présumant que nous parlions 'select' au cours d'une' delete'. – JNK

Répondre

9

Vous pouvez les lots pour l'empêcher de bloquer toute la table:

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

     IF @@ROWCOUNT = 0 
      BREAK 
    END 
+1

Les lignes de 10 Ko se transformeront en verrou de table. Gardez-le sous 5K pour éviter cela. –

+4

Le nombre de verrous requis pour une escalade n'est pas strictement 5K. Il y a plusieurs autres facteurs autour de cela. Ce qui suit est un travail décent de l'expliquer pour SQL 2005: http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/05/17/lock-escalation.aspx –

+3

L'essentiel est d'avoir un index sur CreationDate. Sans cela, une analyse de table est requise pour chaque lot. –

0

Il y a beaucoup de choses qui pourraient changer ce comportement. Cependant, si par beaucoup vous voulez dire plus de 5K enregistrements que ce sera probablement verrouiller. Vous pouvez éviter cela en utilisant des lots plus petits ou en spécifiant un niveau d'isolation qui ne se verrouillera pas.

+2

Vous ne pouvez pas "spécifier un niveau d'isolation qui ne sera pas verrouillé". comme l'OP pose des questions sur 'deletes' et' inserts'. Ceux-ci prendront toujours des verrous. –