2016-05-27 10 views
1

これは初めてのことですので、やさしくしてください。私は2つのテーブルで何百万ものデータ行を削除する必要があります。これをSQLスクリプトで試してみると、ログファイルが非常に大きくなってしまい、すべてのハードドライブを占有して完了しませんでした。私は、データがバッチで削除された場合、ログファイルが同じように影響を受けることはないという、オンラインでいくつかの記事を読んでいました。現在シンプルモードのデータベースで、常にそのように保たれています。これは私がデータを削除するために使用するスクリプトです。バッチ内のデータ行を削除する

Delete from EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate()) 
Delete from EligibilityRequestLog Where ActualPostingDate <= DateAdd(day,-31, getdate()) 

誰かが私はすべての行が削除されるまでの時間でデータの10,000行を削除するSQLジョブとして追加することができますスクリプトで私を助けることができますか?私は、オンラインで次のスクリプトを見つけました。それは私が必要以上に多いかもしれません。 SQLスクリプトを追加しました。

DECLARE @continue INT 
DECLARE @rowcount INT 

SET @continue = 1 
WHILE @continue = 1 
BEGIN 
    PRINT GETDATE() 
    SET ROWCOUNT 10000 
    BEGIN TRANSACTION 
    Delete from EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate()) 
    Delete from EligibilityRequestLog Where ActualPostingDate <= DateAdd(day,-31, getdate()) 
    SET @rowcount = @@rowcount 
    COMMIT 
    PRINT GETDATE() 
    IF @rowcount = 0 
    BEGIN 
     SET @continue = 0 
    END 
END 
+2

以外の何ものでもありませんか?各SQLダイアレクトは異なり、各エンジンは異なる方法で動作します。 MS SQL Serverのようですが、もしそうなら、どのバージョンですか?それが2008+であれば、 'TOP'を使用して10,000行だけを削除し、行が削除されなくなるまでループできます。https://technet.microsoft.com/en-us/library/ms175486(v=sql.105) ).aspxまた、あなたが見つけたスクリプトがあなたのニーズに合っていないのはなぜですか? – MatBailie

+0

これはSQL 2014です。スクリプトが動作するかどうかわかりません。私はそれを試していない。 –

+1

Errrrrrrrr、それを試してみる? – MatBailie

答えて

1
WHILE EXISTS(SELECT * FROM EligibilityInformation WHERE DateEntered <= DATEADD(DAY, -31, GETDATE())) 
BEGIN 
    PRINT GETDATE() 
    DELETE (TOP 10000) FROM EligibilityInformation WHERE DateEntered <= DATEADD(DAY, -31, GETDATE()) 
    PRINT GETDATE() 
END 

WHILE EXISTS(SELECT * FROM EligibilityRequestLog WHERE ActualPostingDate <= DATEADD(DAY, -31, GETDATE())) 
BEGIN 
    PRINT GETDATE() 
    DELETE (TOP 10000) FROM EligibilityRequestLog WHERE ActualPostingDate <= DATEADD(DAY, -31, GETDATE()) 
    PRINT GETDATE() 
END 
+0

ループごとに 'PRINT GETDATE()'が必要なのかどうかは不明です。 1回の反復の2回目の印刷は、次の反復の最初の印刷にほぼ一致します。また、 '@@ rowcount'を使ってループを制御すると(何も削除しませんでした)、' EXISTS'メソッドよりも安いです。 – MatBailie

1

私はあなたが主キーを持っていると仮定しています。これはあなたのために働く必要があります。ここでは

Delete Top 10000 
    From EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate()) 

が設定した行数の上にトップ https://sqlstudies.com/2013/10/07/use-top-instead-of-set-rowcount/

+1

SQL Server 2000の場合でも、SQL Server 2008以降の場合は、DELETE TOP(10000)FROM EligibilityInformation where DateEntered <= DateAdd(day、-31、getdate()) '自己結合またはサブクエリなし必須。あるいは、Opがすでに持っている '@@ rowcount'" trick "を使ってください。しかし、まだ明らかにされていないのは、OpのサンプルコードがOpのニーズには不十分である理由です。 – MatBailie

+0

私は自分の答えを投稿したときにバージョンが指定されていませんでした。彼のコメントが表示されますので編集します。 –

+0

ニースリンク!トリガーへの影響は、私が思い出したものではなく、非常に重要でした。 – MatBailie

0

を選択する理由についての記事である私は、この構文をテストするために、今のサーバーではないですが、これはあります私はトランザクションで2を置く

select 1 -- to get a @@rowcount > 0 
while (@@rowcount > 0) 
begin 
    delete (top 1000) from table where ... 
end 

を使用する何かが、私は何の価値を見ないオーバーヘッドのほんのLOTです。せいぜい、単一のセット(上)をロールバックすることになります。単一のトランザクションでループをラップするのにうんざりするなら、それをセットで実行すると何も追加されません。

あなたが今持っているスクリプトがどのRDBMS

BEGIN TRANSACTION 
Delete from EligibilityInformation Where DateEntered <= DateAdd(day,-31, getdate()) 
Delete from EligibilityRequestLog Where ActualPostingDate <= DateAdd(day,-31, getdate()) 
COMMIT 
関連する問題