1

特定のテーブルに数百万行を含む古典的な「販売」データベースがあります。これらの大きなテーブルのそれぞれに、関連付けられた「削除」トリガーと「バックアップ」テーブルがあります。

このバックアップテーブルは、過去7日間「削除された」行を保持します。トリガーは、削除された行をそのバックアップテーブルにコピーすることから始まり、次の方法でバックアップの削除を実行します。

CREATE TRIGGER dbo.TRIGGER
ON dbo.EXAMPLE_DATA
FOR DELETE AS
INSERT INTO EXAMPLE_BACKUP
select getDate(), *
from deleted
DELETE from EXAMPLE_BACKUP
where modified < dateadd(dd, -7, getDate())

バックアップテーブルの構造は、元のデータテーブル(キー、値)と同様です。唯一の違いは、バックアップテーブルに「変更された」フィールドを追加し、それをキーに統合することです。

私の同僚は、バックアップテーブルに数百万行が含まれるとすぐに、deleteステートメントによってタイムアウト/問題が発生するため、「ループ」を使用する必要があると教えてくれました。その削除は実際にある時点で爆発しますか?別の方法で何かをする必要がありますか?

4

1 に答える 1

3

Sybase12.5はテーブルのパーティション分割をサポートしているようです。(ハードブレークポイントを使用して)データを正確に7日間保持できるように設計されている場合は、その年の日にテーブルを分割し、現在のデータを表すビューを作成できます。時計が特定の日を過ぎたときに、古いパーティションを明示的に切り捨てることができます。

ちょっとした考え。

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.dc20020_1251/html/databases/X15880.htm

それ以外の場合、ループで削除することは、トランザクションログを爆破することなくデータの大きなサブセットを削除するための合理的な方法です。SQLServerを使用する1つの方法は次のとおりです。

http://sqlserverperformance.wordpress.com/2011/08/13/gradually-deleting-data-in-sql-server/

于 2012-06-28T11:49:43.420 に答える