回答
退房truncate table這快很多。
是的,刪除500萬行可能需要很長時間。我能想到的唯一可能更快的方法是放棄表格並重新創建表格。當然,如果你想刪除表中的所有數據,這隻會起作用。
截斷表client_log
是你最好的選擇,截斷殺死表和索引的所有內容並重置你有過任何種子。
在SQL Server上,您可以使用Truncate Table
命令,該命令比常規刪除更快,並且使用的資源也更少。它會將任何標識字段重置爲種子值。
截斷的缺點是它不能用於被外鍵引用的表,並且不會觸發任何觸發器。如果出現任何問題,您也將無法回滾數據。
我在msdn transact-SQL參考中發現了TRUNCATE TABLE。對於這裏所有感興趣的是:
TRUNCATE TABLE在功能上與不帶WHERE子句的DELETE語句相同:都刪除表中的所有行。但是TRUNCATE TABLE比DELETE使用更少的系統和事務日誌資源。
DELETE語句一次刪除一行,並在事務日誌中記錄每個刪除行的條目。 TRUNCATE TABLE通過釋放用於存儲表數據的數據頁來移除數據,並且只有頁解除分配被記錄在事務日誌中。
TRUNCATE TABLE刪除表中的所有行,但表結構及其列,約束,索引等依然存在。新行的標識使用的計數器重置爲列的種子。如果您想保留身份計數器,請改用DELETE。如果要刪除表定義及其數據,請使用DROP TABLE語句。
您不能在由FOREIGN KEY約束引用的表上使用TRUNCATE TABLE;相反,使用不帶WHERE子句的DELETE語句。由於未記錄TRUNCATE TABLE,因此無法激活觸發器。
TRUNCATE TABLE不能用於參與索引視圖的表格。
僅供參考TRUNCATE TABLE也適用於MySQL的
truncate table
獨立不 SQL平臺。如果您懷疑可能曾經更改數據庫提供程序,您可能會謹慎使用它。
「刪除並重新創建表格」的建議可能不是一個好建議,因爲這會導致您的外鍵失效。
您正在使用外鍵,對不對?
請注意,TRUNCATE還會重置任何自動遞增鍵,如果您正在使用這些鍵。
如果不希望丟失自動遞增鍵,可以通過刪除組(例如,DELETE FROM表WHERE id> 1 AND id < 10000)來加快刪除速度。它將顯着提高速度,並在某些情況下防止數據被鎖定。
我修改我先前說的:
你應該明白,通過使用 截斷的數據將被清除,但 什麼都不會被記錄到 事務日誌。寫入日誌 是爲什麼DELETE將永遠佔用5行0,萬行。我在開發過程中經常使用TRUNCATE ,但是您應該注意 在生產 數據庫上使用它,因爲您不能使用 回滾您的更改。你應該 立即做一個完整的數據庫 備份後做一個TRUNCATE到 建立一個新的恢復基礎。
以上聲明旨在提示您確定您明白兩者之間存在差異。不幸的是,它寫得很差,並且沒有支持的語句,因爲我沒有在兩者之間自己做任何測試。它基於我從別人那裏聽到的聲明。
從MSDN:
DELETE語句刪除行一個 在同一時間,並記錄在 事務日誌刪除的每一行的條目。 TRUNCATE TABLE刪除數據 解除分配用於存儲表數據的數據頁,並且只有 頁解除分配記錄在 事務日誌中。
我只是想說這兩者之間存在根本差異,因爲存在差異,會有應用程序在其中一個或另一個可能不合適。
TRUNCATE以某種方式跳過事務日誌有個常見的誤解。
這是誤解,在MSDN中明確提到。
這個神話在這裏的幾個註釋中被調用。讓我們來根除它在一起;)
如果你不能使用,因爲外鍵和/或觸發TRUNCATE TABLE,你可以考慮:
- 刪除所有索引;
- 做一般的DELETE;
- 重新創建所有索引。
這可能會加快DELETE的速度。
忘記截斷和刪除。維護你的表定義(如果你想重新創建它),並使用drop table。
我使用下面的方法來清零表格,並帶來額外的好處,它爲我留下了表格的存檔副本。
CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
DELETE * FROM table_name;
過早的優化可能是危險的。優化可能意味着做一些奇怪的事情,但如果它起作用,您可能想要利用它。
SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;
對於速度,我認爲這取決於...
底層數據庫:甲骨文,微軟,MySQL和PostgreSQL,其他人,自定義...
表,它的內容和相關表格:
可能存在刪除規則。是否存在刪除表中所有內容的現有過程?這可以針對特定的底層數據庫引擎進行優化嗎?我們對打破事物/相關數據有多重視?假設其他相關表不依賴於此表,執行DELETE可能是「最安全」的方式。是否有其他表和查詢相關/取決於此表中的數據?如果我們不關心這個表格是否在意,使用DROP可能是一種快速方法,同樣取決於底層數據庫。
DROP TABLE table_name;
有多少行被刪除?是否還有其他信息能夠快速收集到優化刪除的信息?例如,我們可以告訴桌子是否已經空了嗎?我們能否分辨出是否有數百,數千,數百億行?
- 1. 刪除不在數據表中的文件的最快方法?
- 2. C#刪除所有數據表的最佳方法
- 3. 刪除對SQL字段的所有引用的最快方法?
- 4. 使用JayData從WebSql/IndexedDb表中刪除所有記錄的最快方法
- 5. 從表格中刪除所有數據的最佳方法是什麼?
- 6. 從sql 2005數據庫中刪除所有表的最佳方法
- 7. 什麼是刪除Excel表格的所有空行的最快方法?
- 8. 從字典中刪除大量密鑰的最快方法
- 9. 使用NHibernate刪除表中所有行的最佳方法?
- 10. 刪除t-sql中所有大表的最佳方法是什麼?
- 11. 從oracle中的兩個大表中刪除公共數據的最佳方法?
- 12. 刪除/刪除矢量項的最有效/最快捷的方法
- 13. 刪除列表中的重複項的最快方法Python
- 14. 刪除表中的所有數據,但最後N個條目
- 15. 更新數據表的最快方法
- 16. 從列表中刪除鏡像對象的最快方法
- 17. 什麼是刪除WinJS ListView中所有項目的最快方法?
- 18. 智能/快速刪除組織的所有數據集的「一次性」方法?
- 19. 從多個表中刪除數據的最佳方法?
- 20. 從數據表中刪除重複條目的最佳方法
- 21. 從Sugar ORM中刪除所有表中的所有數據
- 22. 如何刪除Seed方法中的所有數據?
- 23. 刪除數據庫中的所有內容並從頭開始重建的最快方法?
- 24. 聯合所有最快的方法
- 25. 從數據庫的所有表中刪除所有記錄
- 26. 從數據庫的所有表中刪除所有行
- 27. 所有數據有刪除
- 28. 如何刪除RealmResults列表中最快和最簡單的所有項目?
- 29. 根據空白單元格刪除整行的最快方法
- 30. 從表中刪除所有重複行的最有效方法是什麼?
TRUNCATE是最快的,只要記住,在事件發生的時候你將無法回滾數據。 – 2008-09-15 15:50:52
有關TRUNCATE的說明,如果其中一列是IDENTITY列,則TRUNCATE會將該列的SEED重置爲其初始值(定義表時指定的一個值)。所以從某種意義上說,它就像是從一張全新的桌子開始。我發現它在重新填充表之前清理數據很有用 – kristof 2008-09-23 16:53:09
是的,而在Oracle世界中我們稱之爲水印轉換,並不確定其他人。 – 2008-12-30 09:55:11