0

維持しなければならない古いデータベースに問題があります。それは何年も前から存在しています (いいえ、私が設計したわけではありません。変更を加えることはできません)。

次のようになります。「ドキュメント」と「バージョン」の 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)。ステップは失敗しました。"

私は今ちょっと迷っています、何かアイデアはありますか?

4

1 に答える 1

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
于 2013-09-24T18:42:32.660 に答える