Como fazer o servidor SQL agir como um ser humano usando WAITFOR
Foto de Fischer Twins em Unsplash
Você provavelmente afina suas consultas para o desempenho máximo. Você tem orgulho em saber como adicionar índices e código de refactor, a fim de espremer até a última gota do potencial de desempenho do seu servidor. A velocidade costuma ser o rei.
é por isso que você provavelmente não usa o comando WAITFOR do servidor SQL regularmente-ele realmente faz sua consulta geral correr mais devagar . no entanto, a lentidão nem sempre é uma coisa má. Hoje quero mostrar-vos duas das minhas maneiras preferidas de usar o comando de espera.
veja o vídeo desta semana no YouTube
Você também pode ver o conteúdo desta semana no meu canal do YouTube .
1. Construir um computador humano é rápido. Os CPUs executam bilhões de ações por segundo, a quantidade de fabricantes de RAM pode encaixar em um pau aumenta regularmente, e SSDs estão rapidamente fazendo disco I/O diz respeito a uma coisa do passado. enquanto todas essas coisas são ótimas para o processamento de grandes cargas de trabalho, elas movem os computadores cada vez mais longe da “velocidade humana”.
mas “velocidade humana” é às vezes o que você quer. Talvez queira simular a utilização das aplicações na sua base de dados ou a carga criada pelos analistas que executam consultas ad hoc contra o seu servidor.
Este é o lugar onde eu amo usar WAITFOR DELAY – ele pode simular os seres humanos a execução de consultas extremamente welll:
-- Run foreverWHILE (1=1)BEGIN --Insert data to simulate an app action from our app EXEC dbo.BuyDonuts 12 -- We usually average an order every 3 seconds WAITFOR DELAY '00:00:03'END
Jogar em alguns psuedo-geração de números aleatórios e algumas instruções SE, e você tem uma falsa carga do servidor, você pode começar a usar:
WHILE (1=1)BEGIN -- Generate command values 1-24 DECLARE @RandomDonutAmount int = ABS(CHECKSUM(NEWID()) % 25) + 1 -- Generate a delay between 0 and 5 seconds DECLARE @RandomDelay int = ABS(CHECKSUM(NEWID()) % 6) EXEC dbo.BuyDonuts @RandomDonutAmount WAITFOR DELAY @RandomDelayEND
2. O corretor de serviços do homem pobre
Corretor de Serviços é uma grande característica no servidor SQL. Ele lida com mensagens e cenários de Fila muito bem, mas requer mais tempo de configuração para que eu geralmente não gosto de usá-lo em cenários onde eu preciso de algo rápido e sujo.
em Vez de ter que configurar o Service Broker para saber quando alguns dados está disponível ou um processo está pronto para ser chutado para fora, eu posso fazer o mesmo com um loop WHILE e uma WAITFOR:
DECLARE @Quantity smallint = NULL-- Keep checking our table data until we find the data we wantWHILE (@Quantity IS NULL)BEGIN -- Delay each iteration of our loop for 10 seconds WAITFOR DELAY '00:00:03' -- Check to see if someone has bought a dozen donuts yet SELECT @Quantity = Quantity FROM dbo.Orders WHERE Quantity = 12END-- Run some other query now that our dozen donut purchase condition has been metEXEC dbo.GenerateCoupon
Fantasia? Não. Prático? Sim.
não preciso mais de verificar uma tabela para resultados antes de executar uma consulta-eu posso ter que esperar por fazer isso para mim.
Se souber que existe um tempo específico que deseja esperar até começar a procurar algum processo, poderá incorporar o tempo de espera para tornar a sua verificação ainda mais inteligente:
DECLARE @Quantity smallint = NULL-- Let's not start checking until 6am...that's when the donut shop opensWAITFOR TIME '06:00:00'-- Keep checking our table data until we find the data we wantWHILE (@Quantity IS NULL)BEGIN -- Delay each iteration of our loop for 10 seconds WAITFOR DELAY '00:00:03' -- Check to see if someone has bought a dozen donuts yet SELECT @Quantity = Quantity FROM dbo.Orders WHERE Quantity = 12END-- Run some other query now that our dozen donut purchase condition has been metEXEC dbo.GenerateCoupon