web-dev-qa-db-ja.com

印刷メッセージがバッチで出てきます

簡単なクエリがあります

WHILE ( @counter < 50 )
    BEGIN
        BEGIN TRANSACTION
        PRINT 'Counter = ' + CONVERT(VARCHAR(4), @counter);
        WITH    CTE
                  AS (
                       SELECT TOP 50000 * FROM MyTable
                     )
            DELETE FROM CTE OPTION ( MAXDOP 1 )
        SET @counter += 1
        COMMIT TRAN
    END

メッセージを見ると、PRINTコマンドはループごとに行を返すのではなく、複数行として表示されます。 1行追加しましたが、一度に1行表示され、プロセス全体がはるかに高速になりました。

WHILE ( @counter < 50 )
    BEGIN
        WAITFOR DELAY '00:00:00.5' --< This line
        BEGIN TRANSACTION
        PRINT 'Counter = ' + CONVERT(VARCHAR(4), @counter);
        WITH    CTE
                  AS (
                       SELECT TOP 50000 * FROM MyTable
                     )
            DELETE FROM CTE OPTION ( MAXDOP 1 )
        SET @counter += 1
        COMMIT TRAN
    END

では、ループの各反復に.5秒の待機時間を追加すると、実際にはより速く実行され、印刷メッセージが一度に1つずつ出力されるのはなぜですか?

4

PRINT出力はバッファリングされます。 PRINT ...RAISERROR ... WITH NOWAITで置き換えると、結果が表示されます。

DECLARE @msg VARCHAR(MAX);
DECLARE @counter INT;
WHILE (@counter < 50)
BEGIN
    BEGIN TRANSACTION
    SET @msg = 'Counter = ' + CONVERT(VARCHAR(4), @counter);
    RAISERROR (@msg, 0, 1) WITH NOWAIT;
    ;WITH CTE
    AS (
        SELECT TOP(50000) * 
        FROM MySchema.MyTable
        )
    DELETE FROM CTE OPTION (MAXDOP 1);
    SET @counter += 1;
    COMMIT TRAN
END
4
Max Vernon