sql >> データベース >  >> RDS >> Sqlserver

SQLServerで100万行を削除する

    上記で提案したバッチ削除の構造は次のとおりです。一度に1Mを試さないでください...

    バッチのサイズと待機遅延は明らかにかなり変動し、サーバーの機能と競合を軽減する必要性によって異なります。一部の行を手動で削除し、それらにかかる時間を測定し、サーバーが処理できるサイズにバッチサイズを調整する必要がある場合があります。上記のように、5000を超えるとロックが発生する可能性があります(私は気づいていませんでした)。

    これは数時間後に行うのが最適です...しかし、100万行はSQLが処理するのに実際には多くありません。 SSMSでメッセージを表示する場合、印刷出力が表示されるまでに時間がかかる場合がありますが、数回のバッチ処理の後、リアルタイムで更新されないことに注意してください。

    編集:停止時間を追加しました@MAXRUNTIME@BSTOPATMAXTIME@BSTOPATMAXTIMEを設定した場合 1にすると、スクリプトは希望の時間、たとえば午前8時に自動的に停止します。このようにして、毎晩、たとえば深夜に開始するようにスケジュールを設定できます。また、本番前の午前8時に停止します。

    編集:回答はかなり人気があるので、RAISERRORを追加しました PRINTの代わりに コメントごと。

    DECLARE @BATCHSIZE INT, @WAITFORVAL VARCHAR(8), @ITERATION INT, @TOTALROWS INT, @MAXRUNTIME VARCHAR(8), @BSTOPATMAXTIME BIT, @MSG VARCHAR(500)
    SET DEADLOCK_PRIORITY LOW;
    SET @BATCHSIZE = 4000
    SET @WAITFORVAL = '00:00:10'
    SET @MAXRUNTIME = '08:00:00' -- 8AM
    SET @BSTOPATMAXTIME = 1 -- ENFORCE 8AM STOP TIME
    SET @ITERATION = 0 -- LEAVE THIS
    SET @TOTALROWS = 0 -- LEAVE THIS
    
    WHILE @BATCHSIZE>0
    BEGIN
        -- IF @BSTOPATMAXTIME = 1, THEN WE'LL STOP THE WHOLE JOB AT A SET TIME...
        IF CONVERT(VARCHAR(8),GETDATE(),108) >= @MAXRUNTIME AND @BSTOPATMAXTIME=1
        BEGIN
            RETURN
        END
    
        DELETE TOP(@BATCHSIZE)
        FROM SOMETABLE
        WHERE 1=2
    
        SET @[email protected]@ROWCOUNT
        SET @[email protected]+1
        SET @[email protected][email protected]
        SET @MSG = 'Iteration: ' + CAST(@ITERATION AS VARCHAR) + ' Total deletes:' + CAST(@TOTALROWS AS VARCHAR)
        RAISERROR (@MSG, 0, 1) WITH NOWAIT
        WAITFOR DELAY @WAITFORVAL 
    END
    


    1. MySQLで緯度に近いポリゴンを取得します

    2. サーバーでサーバーストレージ情報を取得するためのストアドプロシージャ

    3. MAGMIを使用したMagentoの一括インポート画像-画像は除外

    4. 'CREATE'またはその近くでのplpgsqlCREATEFUNCTION構文エラー