2013-09-24 90 views
0

我在維護一些古老的數據庫時遇到了一些麻煩。它已經存在很長時間了(不,我沒有設計它,不可能對它做任何改變)SQL Server 2008作業錯誤1204鎖

它是這樣的:有兩個表格,「文檔」和「版本」。文檔是一個非常簡單的表格,只是一個主鍵,一個varchar存儲文檔名稱和創建該文檔的用戶.Versions具有它所屬文檔的外鍵,存儲實際文檔的圖像字段(主要是單詞文檔和pdf),擴展名和另一個保留版本號的字段。

每當應用程序(ANCIENT VB6應用程序)使用文檔時,都會生成新版本。

每天晚上都會在數據庫上運行一項作業,以便刪除除每個文檔的最新版本之外的所有版本。這一直在努力,永遠。

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 

問題是沉綿日常版本表有這份工作,爲了拋棄它最早的條目運行,數據庫是達到驚人的規模(目前300 + GB)。

爲了減小尺寸,有人最終意識到不需要保留版本控制pdf元素。所以,我被命令採用一個簡單的修改:

這項工作將刪除舊版本的文檔,保留最新的5個版本。對於任何其他類型的文件,除最新版本之外的所有版本都將被刪除。所以,我改變了存儲過程中的工作關聯到本:

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 
AND extension LIKE 'do%'; 

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument) 
AND extension NOT LIKE 'do%'; 

然而,將變更後,第二天作業歷史通知下面的錯誤

「的SQL Server實例數據庫引擎目前無法獲得LOCK資源,當活動用戶較少時重新運行您的語句,請數據庫管理員檢查此實例的鎖定和內存配置,或檢查長時間運行的事務[SQLSTATE HY000](錯誤1204)該步驟失敗。「

我現在有點迷路了,有什麼想法嗎?

+0

運行此查詢需要多長時間? (SELECT COUNT(*)FROM t_ad_Versions WHERE VersionNumber sqlint

+0

可能試圖一次刪除太多東西。請參閱http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4419eab8-7e35-492f-9a12-0c56932d702a/sql-jobs-cannot-obtain-a-lock-resource-at-this-time –

回答

1

您可以嘗試刪除100行或任何快速運行的行。

declare @rows int 
set @rows = 1 
while @rows > 0 
BEGIN 
DELETE TOP (100) FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 AND extension LIKE 'do%'; 
set @rows = @@ROWCOUNT 
END 
+0

好吧,如果有更正統的解決方案來處理sql服務器鎖,那麼dunnot就沒有辦法了。實際上,由於政策的改變,這項工作被要求刪除非Word文檔的所有以前版本,這意味着有超過200,000行要刪除,顯然這太難處理了。工作從凌晨2點開始,至今已經7小時,至今仍在運行,到目前爲止數據庫已降至230GB。 – Hobbes

+0

您可以將TOP(100)增加到1000.它應該加快刪除過程,但會增加鎖定錯誤的概率。 – sqlint

+0

您可以在MaxVersion上創建一個NONCLUSTERED INDEX,刪除語句的擴展列。 – sqlint