Ao atualizar uma coluna em uma tabela no último dia, meu DBA sênior mostrou uma nova técnica para reduzir leituras e contenção.
O pseudo-código é
WHILE
[always true condition]
BEGIN
UPDATE [...]
IF @@ROWCOUNT = 0 BREAK;
END
No entanto, ao executar isso, acidentalmente deixei Incluir Plano de Execução Real ativado, na guia Mensagens, vi ocorrências repetidas disso:
(1000 row(s) affected)
(1 row(s) affected)
No entanto, o código funcionou e o loop WHILE funcionou!
Minha pergunta é, se incluir o Plano de Execução Real retornar 1 linha afetada, isso não deveria criar um loop infinito?
Por que não está sendo contabilizado?
Exemplos de tabelas abaixo:
USE [tempdb];
GO
CREATE TABLE [dbo].[UpdateMePlease]
([ID] INT IDENTITY(1, 1), [UselessNote] VARCHAR(10) DEFAULT 'Delete me!', [UpdateValue] VARCHAR(10) NULL)
GO
INSERT INTO [dbo].[UpdateMePlease] ([UselessNote]) DEFAULT VALUES;
GO 10000
SELECT * FROM [dbo].[UpdateMePlease];
/* turn Actual Execution Plan on here */
WHILE 1 = 1 BEGIN
UPDATE TOP (1000) [dbo].[UpdateMePlease]
SET [UpdateValue] = [UselessNote]
WHERE [UpdateValue] IS NULL;
IF @@ROWCOUNT = 0 BREAK
END
-- Clean up
DROP TABLE [dbo].[UpdateMePlease];
Essa
DONE_IN_PROC
mensagem do plano de execução é completamente independente do seuWHILE
loop e não é o que está sendo verificado em seu arquivoBREAK
. Martin excluiu sua resposta, mas isso é muito intencional. Sua consulta não deve se comportar de maneira diferente dependendo se sua ferramenta cliente está ou não recuperando planos de execução - isso seria ruim. Os planos de execução são para monitoramento e revisão, não para influenciar o comportamento real.Observe que o inverso também não é necessariamente um dado - nem todas as coisas que serão preenchidas
@@ROWCOUNT
levarão àDONE_IN_PROC
mensagem, por exemploIsso renderá
1
no painel de mensagens, mas você não verá1 row(s) affected.
Agora, sempre fui um grande fã de usar
SET NOCOUNT ON;
, o que torna essa questão bastante discutível. Mas parece que o impactoDONE_IN_PROC
nas versões modernas não é o que costumava ser quando formei esta opinião: