[英]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 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.