2012-02-01 103 views
15

我有一個SQL Server 2008 R2實例中的此表,我有一個夜間運行的計劃進程。該表可以在任何時候向上至500K記錄。處理此表後,我需要從它刪除所有行,所以我想知道它下面的方法將產生最少的開銷(即過多的事務日誌條目):截斷或刪除並創建表

  1. 截斷表
  2. 刪除並重新創建表

刪除表中的內容是由於時間和額外的事務日誌條目而產生的。

共識似乎是截斷,謝謝大家!

+4

[這裏記錄的數量之間的一些比較](http://dba.stackexchange.com/a/7685/3690)。 'TRUNCATE'的日誌記錄比'DROP'少一點,因爲刪除也會導致該對象的關聯行從系統表中刪除(同時也記錄下來) – 2012-02-01 20:47:30

回答

8

截斷表不會在事務日誌中留下逐行條目 - 因此,這兩種解決方案都不會使日誌混亂不堪。如果是我,我會截斷不得不放棄並創建每一次。

13

TRUNCATE TABLE是你最好的選擇。 From MSDN

刪除表中的所有行而不記錄單個行 刪除。

所以這意味着它不會膨脹你的交易記錄。刪除和創建表格不僅需要更復雜的SQL,還需要額外的權限。附加到表格的任何設置(觸發器,GRANTDENY等)也將不得不重新構建。

5

我會去TRUNCATE TABLE。當索引,觸發器等被丟棄時,您可能會有開銷。另外,您將失去必須重新創建的權限以及該表所需的任何其他必需對象。

而且在它下面MDSN DROP TABLE如果執行DROP,並在同一批次CREATE TABLE

DROP TABLE和CREATE TABLE提到一點疑難雜症不應該在同一個表 在同一批次中執行。否則可能會發生意外錯誤。

2

刪除表將銷燬任何關聯的對象(索引,觸發器),並可能使過程或視圖無效。我會去truncate,因爲它不會炸燬你的日誌,並導致沒有任何可能的問題下降和創建。

+0

謝謝,沒有任何關聯的索引或觸發器,我只是擔心交易日誌變得太大。 – 2012-02-01 20:54:01

+0

當我開始向表中添加擴展屬性時,以及由於我的t-sql腳本使用了drop-and-create,我不得不重新輸入擴展屬性並將腳本更改爲截斷。之後沒有丟失擴展屬性。 – 2016-04-29 21:58:19