2011-05-26 82 views
6

如果我嘗試從表格中刪除早午餐的數據。說刪除SQL是否鎖定阻止將新數據插入SQL Server 2005的表?

DELETE FROM myTable Where CreationDate < GetDate() 

需要幾個小時才能刪除,這個表將被鎖定,並沒有新的插入可能發生?

此表不自引用。我會假設我仍然可以在刪除時插入新數據。刪除sql是否會使用排他鎖來防止對錶的所有訪問?

謝謝

+0

刪除我的回答 - 我讀得太快,我們假設一個'DELETE'期間都在談論'SELECT'。 – JNK 2011-05-26 18:00:20

回答

9

可以批量他們,以防止它鎖定整個表:

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

     IF @@ROWCOUNT = 0 
      BREAK 
    END 
+1

10K行將升級到表鎖。保持在5K以下,以防止這種情況發生。 – 2011-05-26 17:53:04

+4

升級所需的鎖數不嚴格爲5K。還有其他幾個因素。以下是解釋SQL 2005的體面工作:http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/05/17/lock-escalation.aspx – 2011-05-26 18:00:11

+3

關鍵的是要有一個索引在CreationDate上。不需要每個批次的表格掃描。 – 2011-05-26 18:03:05

0

有很多事情可以改變這種行爲。但是,如果您認爲超過5K條記錄的數量可能會超過可能鎖定的數量。您可以通過使用較小的批次或指定不會鎖定的隔離級別來避免這種情況。

+2

您不能「指定不會鎖定的隔離級別。」因爲OP在詢問「刪除」和「插入」。這些將始終鎖定。 – 2011-05-26 17:49:05