2015-12-28 44 views
0

我在數據庫中解決問題期間遇到問題。我試圖尋找答案,但我發現了兩個模棱兩可的決議。在羣中刪除 - 自動提交與開始/提交事務

問題: 在刪除大量數據期間,我收到一個錯誤:'數據庫事務日誌'[TableName]'已滿。'我被建議刪除部分數據。

我發現了兩個不同的方式進行管理這一問題:

1)

DECLARE @Count INT 
Declare @for_delete INT 
Declare @chunk_size INT 
SELECT @chunk_size=100000 
SELECT @Count = 0 
select @for_delete=count(*) from [Your big table] where  [Your Where Clause] 
While (@Count < @for_delete) 
BEGIN 
SELECT @Count = @Count + @chunk_size 
BEGIN TRAN 
DELETE top(@chunk_size) FROM  [Your big table] where  [Your Where Clause] 
COMMIT TRAN 
END 

2)

WHILE EXISTS(SELECT TOP 1 1 FROM Table) 
BEGIN 
DELETE TOP (10000) FROM Table 
END 

我的問題是,爲什麼在第一個例子,有一個開始/提交單一操作(刪除頂部(x)....)?我認爲單個操作是自動提交 - 因此開始/提交不是必需的? 能否請你解釋一下哪個選項最適合避免關於完整事務日誌的錯誤?單次操作是否需要開始/執行轉換? 非常感謝您的幫助。

+0

這是您只需要一次的東西,還是您需要更頻繁或作爲某個業務流程的一部分? – Shnugo

+0

這是業務流程的一部分。我需要調整所有程序(負責刪除數據)以刪除部分數據。 – Anakhin

+0

這些刪除操作會在用戶在表格中工作時運行嗎?或者這會是「夜間清理」嗎? – Shnugo

回答

0

打開和關閉事務可能不是必需的,但這是一個好習慣。

由於兩種方法都在一個大工作內運行,所以隱式事務在作業結束之前未關閉。

您可以嘗試在自己的作業中運行每個刪除部分。在SQL Server Management Studio中,有機會使用帶有INT參數的「GO」:在這裏閱讀:https://stackoverflow.com/a/3092835/5089204

有了這個非常有用的技巧,您可以在每一回閤中刪除您的塊並運行DBCC SHRINKFILE(N'YourLogFile',0,TRUNCATEONLY)

+0

非常感謝Shnugo! – Anakhin