Loading…

[Resposta do Desafio] O que pode causar um comportamento estranho no waitfor delay?

Fala Pessoal,

Passando aqui para compartilhar a resposta de um desafio que fiz no Linkedin.

Se ainda não me segue por lá, antes tarde que mais tarde:

Desafio: O que pode causar esse comportamento abaixo?

Você executa um waitfor delay de 1 minuto e faz um datediff para salvar o tempo da execução.

O SQL Server vai lá e grava 2 minutos e 5 segundos no resultado. kkkk

Rodrigo Ribeiro Gomes desvendou o mistério e achou duas situações que causam isso.

Código:

create table testWaitfor(ts datetime, e datetime, dur int)
declare @s datetime = getdate();
waitfor delay ’00:01:00′;
insert into testWaitfor values(@s,getdate(),datediff(MS,@s,getdate()))
select * from testWaitfor

*Ninguem fez update na tabela para ficar com esse result
**somente essa query rodando no ambiente (sem concorrência e recursos sobrando)

 

Resposta do Desafio (Essa ninguém acertou)

Como falei, o Rodrigo encontrou duas respostas para esse comportamento.

1 – Alteração da Data do Servidor onde está o SQL Server

Essa é a respota mais simples e que muita gente conseguiu acertar.

Se você inicia o waitfor delay e muda o horário do servidor, na segunda execução do getdate() terá o valor do horário que colocou. Dessa forma, seu waitfor delay irá gerar um valor diferente de 1 minuto.

No meu caso, não era esse porque não alterei nada e mesmo assim tive esse comportamento.

2 – Suspender seu computador

=)

Mano… Era muito difícil adivinhar que isso acontecia.

No meu caso e do Rodrigo foi mais fácil porque tivemos algumas pistas.

Eu acabava meu trabalho as 22h e suspendia minha máquina para dormir. No outro dia de manha ligava ela novamente para voltar a trabalhar.

O PowerAlerts (quem não usar é louco!) agora vem com um log para monitorar o tempo de execução das procedures dele.

Quando fui ver, tinha procedure demorando 13 horas.

Falei, WHAT !!???

Gastei um tempão olhando a proc….

Mas aí percebendo o horário que batia quando eu ia dormir e quanto voltava, ficou mais fácil associar a suspensão do computador.

Vou fazer um teste aqui agora para vocês:

Passo 1 – Executar esse Script

CREATE table testWaitfor(ts datetime, e datetime, dur int)
declare @s datetime = getdate();
waitfor delay ’00:01:00′;
insert into testWaitfor values(@s,getdate(),datediff(MS,@s,getdate()))
select * from testWaitfor

Passo 2 – Suspenda seu PC e aguarde por mais de 1 minuto para ligar novamente

Passo 3 – Após ligar o PC, confira na tabela o Log de execução do waitfor delay

select * from testWaitfor

Que doido né!

Testem ai e me falem se tiveram o mesmo comportamento.

O SQL continua a execução do meu processo após suspender o PC. Ele não mata a conexão como eu achava que seria o comportamento normal.

Claro que ninguém vai suspender um Servidor de produção.

Mas esse é um comportamento inusitado que percebi pela primeira vez nos meus 16 anos de SQL Server.

Curiosidades assim são sempre legais de descobrir.

Valeu Pessoal.

Me siga la no Linkedin que quando aparecer umas coisas doidas assim, posto lá.

Siga o Rodrigo também que ele tem mais desafios ainda para contar para voces.

Inclusive esse recente:

 

Abraços,

Fabrício Lima

CEO Power Tuning

Microsoft Data Platform MVP

Instagram: @fabriciofrancalima

Linkedin: https://www.linkedin.com/in/fabriciofrancalima/

Consultoria: [email protected]

Deixe uma resposta