維持しなければならない古いデータベースに問題があります。それは何年も前から存在しています (いいえ、私が設計したわけではありません。変更を加えることはできません)。
次のようになります。「ドキュメント」と「バージョン」の 2 つのテーブルがあります。Documents は非常に単純なテーブルで、主キー、ドキュメント名とそのドキュメントを作成したユーザーを格納する varchar のみです。Versions には、ドキュメントが属するドキュメントへの外部キー、実際のドキュメントが格納されるイメージ フィールド (主に wordドキュメントと pdf)、拡張子、およびバージョン番号を保持する別のフィールド。
アプリケーション (ANCIENT VB6 アプリケーション) がドキュメントを使用するたびに、新しいバージョンが生成されます。
各ドキュメントの最新の 5 つのバージョンを除くすべてのバージョンを削除するために、データベースで毎晩ジョブが実行されます。これは永遠に機能しています。
DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4
問題は、最も古いエントリを破棄するためにバージョン テーブルで毎日このジョブが実行されているにもかかわらず、データベースが驚くべきサイズ (現在 300 GB 以上) に達していることです。
上記のサイズを縮小するために、誰かが最終的に、pdf 要素のバージョン管理を維持する必要がないことに気付きました。だから、私は簡単な変更を適用するように命じられました:
ジョブは古いバージョンの Word ドキュメントを削除し、最新の 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)。ステップは失敗しました。"
私は今ちょっと迷っています、何かアイデアはありますか?