簡単なクエリがあります
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つずつ出力されるのはなぜですか?
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