tenho uma consulta simples
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
Quando olho para as mensagens, o PRINT
comando não retorna linha a cada loop, mas aparece como várias linhas em uma. Eu adicionei uma linha e agora aparece 1 linha por vez e todo o processo é muito mais rápido.
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
então, por que quando eu adicionei 0,5 segundo de tempo de espera a cada iteração de loop, ele realmente funciona mais rápido e permite que a mensagem de impressão saia uma de cada vez?
PRINT
a saída é armazenada em buffer. Se você substituirPRINT ...
porRAISERROR ... WITH NOWAIT
, verá os resultados conforme eles acontecem.