2008-09-15 69 views

回答

67

退房truncate table這快很多。

+4

TRUNCATE是最快的,只要記住,在事件發生的時候你將無法回滾數據。 – 2008-09-15 15:50:52

+9

有關TRUNCATE的說明,如果其中一列是IDENTITY列,則TRUNCATE會將該列的SEED重置爲其初始值(定義表時指定的一個值)。所以從某種意義上說,它就像是從一張全新的桌子開始。我發現它在重新填充表之前清理數據很有用 – kristof 2008-09-23 16:53:09

+0

是的,而在Oracle世界中我們稱之爲水印轉換,並不確定其他人。 – 2008-12-30 09:55:11

0

是的,刪除500萬行可能需要很長時間。我能想到的唯一可能更快的方法是放棄表格並重新創建表格。當然,如果你想刪除表中的所有數據,這隻會起作用。

0

截斷表client_log

是你最好的選擇,截斷殺死表和索引的所有內容並重置你有過任何種子。

1

在SQL Server上,您可以使用Truncate Table命令,該命令比常規刪除更快,並且使用的資源也更少。它會將任何標識字段重置爲種子值。

截斷的缺點是它不能用於被外鍵引用的表,並且不會觸發任何觸發器。如果出現任何問題,您也將無法回滾數據。

30

我在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不能用於參與索引視圖的表格。

5

僅供參考TRUNCATE TABLE也適用於MySQL的

1

truncate table獨立 SQL平臺。如果您懷疑可能曾經更改數據庫提供程序,您可能會謹慎使用它。

0

「刪除並重新創建表格」的建議可能不是一個好建議,因爲這會導致您的外鍵失效。

您正在使用外鍵,對不對?

1

請注意,TRUNCATE還會重置任何自動遞增鍵,如果您正在使用這些鍵。

如果不希望丟失自動遞增鍵,可以通過刪除組(例如,DELETE FROM表WHERE id> 1 AND id < 10000)來加快刪除速度。它將顯着提高速度,並在某些情況下防止數據被鎖定。

0

我修改我先前說的:

你應該明白,通過使用 截斷的數據將被清除,但 什麼都不會被記錄到 事務日誌。寫入日誌 是爲什麼DELETE將永遠佔用5行0,萬行。我在開發過程中經常使用TRUNCATE ,但是您應該注意 在生產 數據庫上使用它,因爲您不能使用 回滾您的更改。你應該 立即做一個完整的數據庫 備份後做一個TRUNCATE到 建立一個新的恢復基礎。

以上聲明旨在提示您確定您明白兩者之間存在差異。不幸的是,它寫得很差,並且沒有支持的語句,因爲我沒有在兩者之間自己做任何測試。它基於我從別人那裏聽到的聲明。

MSDN

DELETE語句刪除行一個 在同一時間,並記錄在 事務日誌刪除的每一行的條目。 TRUNCATE TABLE刪除數據 解除分配用於存儲表數據的數據頁,並且只有 頁解除分配記錄在 事務日誌中。

我只是想說這兩者之間存在根本差異,因爲存在差異,會有應用程序在其中一個或另一個可能不合適。

12

TRUNCATE以某種方式跳過事務日誌有個常見的誤解。

這是誤解,在MSDN中明確提到。

這個神話在這裏的幾個註釋中被調用。讓我們來根除它在一起;)

0

如果你不能使用,因爲外鍵和/或觸發TRUNCATE TABLE,你可以考慮:

  • 刪除所有索引;
  • 做一般的DELETE;
  • 重新創建所有索引。

這可能會加快DELETE的速度。

3

忘記截斷和刪除。維護你的表定義(如果你想重新創建它),並使用drop table。

3

我使用下面的方法來清零表格,並帶來額外的好處,它爲我留下了表格的存檔副本。

CREATE TABLE `new_table` LIKE `table`; 
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`; 
0
DELETE * FROM table_name; 

過早的優化可能是危險的。優化可能意味着做一些奇怪的事情,但如果它起作用,您可能想要利用它。

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy; 

對於速度,我認爲這取決於...

  • 底層數據庫:甲骨文,微軟,MySQL和PostgreSQL,其他人,自定義...

  • 表,它的內容和相關表格:

可能存在刪除規則。是否存在刪除表中所有內容的現有過程?這可以針對特定的底層數據庫引擎進行優化嗎?我們對打破事物/相關數據有多重視?假設其他相關表不依賴於此表,執行DELETE可能是「最安全」的方式。是否有其他表和查詢相關/取決於此表中的數據?如果我們不關心這個表格是否在意,使用DROP可能是一種快速方法,同樣取決於底層數據庫。

DROP TABLE table_name; 

有多少行被刪除?是否還有其他信息能夠快速收集到優化刪除的信息?例如,我們可以告訴桌子是否已經空了嗎?我們能否分辨出是否有數百,數千,數百億行?

相關問題