我在維護一些古老的數據庫時遇到了一些麻煩。它已經存在很長時間了(不,我沒有設計它,不可能對它做任何改變)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)該步驟失敗。「
我現在有點迷路了,有什麼想法嗎?
運行此查詢需要多長時間? (SELECT COUNT(*)FROM t_ad_Versions WHERE VersionNumber
sqlint
可能試圖一次刪除太多東西。請參閱http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4419eab8-7e35-492f-9a12-0c56932d702a/sql-jobs-cannot-obtain-a-lock-resource-at-this-time –