2014-02-06 49 views
0

它是否更有效率,並最終以1000或10000的塊刪除數據庫中的行?我不得不從許多表中刪除大約3百萬行。我首先做了100K行的刪除,但表現並不好看。我改爲10000,似乎更快地移除。想知道如果DELETE語句更小,比如1K更好。高效DELETE TOP?

想法?

我刪除這樣的:

DELETE TOP(10000) 
FROM TABLE 
WHERE Date < '1/1/2012' 
+0

@Shiva這將是很好,如果它不會是錯的。鏈接在簡單恢復方案中談到較小的日誌。壞消息 - 重要的數據庫不是簡單的恢復。例如,我們每15分鐘進行一次tx日誌備份。有了真正的恢復模型,除非用截斷法擦除表格,否則tx日誌無法填滿。壞消息 - 現實並不符合你。 – TomTom

回答

1

是的,不,它取決於表的使用,由於鎖定。我會嘗試以較慢的速度刪除記錄。所以與op的問題相反。

set rowcount 10000 
while @@rowcount > 0 
begin 
    waitfor delay '0:0:1'  
    delete 
    from table 
    where date < convert(datetime, '20120101', 112) 
end 
set rowcount 0 
1

是的。這一切都取決於你的服務器,但。我的意思是,上次我做了這件事,我正在使用這個方法以6400萬的增量刪除東西(在一個表格上有大約140億行,其中80%最終被刪除了)。我每隔10秒左右就會刪除一次。

這真的取決於你的硬件。去粒度更多的工作,但它意味着更少的等待tx日誌在桌子上運行的其他事情。你必須嘗試並找到你感到舒服的地方 - 沒有最終的答案,因爲它完全依賴於桌子和硬件的使用。

1

我們使用Table Partitioning在不到一秒的時間內刪除了500萬行,但這只是來自一個表。它預先做了一些工作,但最終是最好的方法。這可能不是最適合你的方式。

從我們的文檔有關分區:

比方說,你要500萬行添加到表中,但不想當你這樣做是爲了鎖定表了。我在排序系統中遇到了一個案例,在這個系統中,我無法在不停止系統接單的情況下插入行。壞!如果添加不與當前數據重疊的行,則分區是這樣做的一種方式。

什麼需要注意的:

  • 數據不能重疊的當前數據。你必須在一個值上分割數據。新數據不能在當前分區數據中交織在一起。如果刪除數據,則必須刪除整個分區。你將不會有一個WHERE子句。

  • 如果您正在生產數據庫上執行此操作並希望限制對錶的鎖定,請使用「ONLINE = ON」創建索引。 STEPS的

概述:

  • 添加RECORDS

    • 分區要添加記錄(留空分區的新數據)的表。不要忘記對所有索引進行分區。
    • 創建具有完全相同結構(鍵,數據類型等)的新表。
    • 向新表添加一個約束,以限制該數據,使其適合舊錶中的空白分區。
    • 將新行插入到新表中。
    • 添加索引以匹配舊錶。
    • 用舊錶的空白分區交換新表。
    • 如果您願意,可以對舊錶進行分區。
  • FOR刪除記錄

    • 分區表成組,這樣你要刪除的數據都是由自身的分區(這可能是許多不同的分區)。
    • 使用相同的分區創建一個新表。
    • 將您想要刪除的數據分區交換到新表中。
    • 如果您願意,可以對舊錶進行分區。