簡體   English   中英

刪除t-sql中所有大表的最佳方法是什么?

[英]What is the best way to delete all of a large table in t-sql?

我們遇到了一個有點奇怪的情況。 基本上,我們的一個數據庫中有兩個表格,這些表格是我們不需要或不關心的大量日志信息。 部分原因是我們的磁盤空間不足。

我正在試圖清理表格,但這是永遠的(在周末運行之后仍有57,000,000條記錄......而這只是第一張桌子!)

只是使用刪除表是永遠占用並占用驅動器空間(我相信因為事務日志。)現在我正在使用while循環一次刪除記錄X,同時玩X來確定實際上最快的。 例如,X = 1000需要3秒,而X = 100,000需要26秒......其中數學運算稍快一些。

但問題是,是否有更好的方法?

(完成此操作后,要運行SQL代理作業,請每天清理一次表...但需要先清除它。)

在刪除之前TRUNCATE表或禁用索引

TRUNCATE TABLE [tablename]

截斷將刪除表中的所有記錄,而不單獨記錄每個刪除。

要添加到其他響應,如果要保留過去一天的數據(或過去一個月或一年或其他),然后將其保存,請執行TRUNCATE TABLE,然后將其重新插入原始表:

SELECT
     *
INTO
     tmp_My_Table
FROM
     My_Table
WHERE
     <Some_Criteria>

TRUNCATE TABLE My_Table

INSERT INTO My_Table SELECT * FROM tmp_My_Table

接下來要做的就是問問自己,如果沒有人關心它,你為什么要將所有這些信息都插入到日志中。 如果你真的根本不需要它,那么關閉源頭的日志記錄。

1)截斷表

2)腳本輸出表,刪除並重新創建表

TRUNCATE TABLE [tablename]

將刪除所有記錄而不記錄。

根據您要保留的數量,您可以將所需的記錄復制到臨時表,截斷日志表,並將臨時表記錄復制回日志表。

如果你能計算出最佳的x,那么它將以最快的速度不斷地循環刪除。 設置rowcount會限制在循環的每個步驟中將被刪除的記錄數。 如果日志文件太大; 在循環中粘貼一個計數器並截斷每百萬行左右。

設置@@ rowcount x而1 = 1開始

從表中刪除如果@@ Rowcount = 0則中斷

結束

將db上的日志記錄模式更改為simple或bulk logs將減少一些刪除開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM