Come rendere SQL Server agire come un essere umano Utilizzando WAITFOR
Foto di Fischer Twins su Unsplash
Probabilmente sintonizzare le query per le massime prestazioni. Sei orgoglioso di sapere come aggiungere indici e codice refactoring per spremere fino all’ultima goccia il potenziale di prestazioni del tuo server. La velocità è di solito re.
Ecco perché probabilmente non si utilizza il comando WAITFOR di SQL Server regolarmente – in realtà rende la query complessiva più lenta .
Tuttavia, la lentezza non è sempre una brutta cosa. Oggi voglio mostrarvi due dei miei modi preferiti per utilizzare il comando WAITFOR.
Guarda il video di questa settimana su YouTube
Puoi anche guardare i contenuti di questa settimana sul mio canale YouTube .
1. Costruire un umano
I computer moderni sono veloci. Le CPU eseguono miliardi di azioni al secondo, la quantità di RAM prodotta può stipare su un bastone aumenta regolarmente, e gli SSD stanno rapidamente facendo disco I/O riguarda una cosa del passato.
Mentre tutte queste cose sono ottime per l’elaborazione di carichi di lavoro di grandi dimensioni, spostano i computer sempre più lontano dalla “velocità umana”.
Ma la “velocità umana” a volte è ciò che vuoi. Forse vuoi simulare l’utilizzo dell’app sul tuo database o il carico creato dagli analisti che eseguono query ad hoc sul tuo server.
Questo è dove amo usare WAITFOR DELAY – può simulare gli esseri umani che eseguono query molto bene:
-- 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
Inserisci un po ‘ di generazione di numeri casuali psuedo e alcune istruzioni IF, e hai un carico di server falso puoi iniziare a usare:
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. Broker di servizi del povero
Il broker di servizi è una grande funzionalità in SQL Server. Gestisce molto bene gli scenari di messaggistica e accodamento, ma richiede più tempo di configurazione, quindi di solito non mi piace usarlo in scenari in cui ho bisogno di qualcosa di veloce e sporco.
Invece di dover impostare Service Broker per sapere quando alcuni dati sono disponibili o un processo è pronto per essere avviato, posso fare lo stesso con un ciclo WHILE e un 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
Fancy? No. Pratico? Sì.
Non ho più bisogno di continuare a controllare una tabella per i risultati prima di eseguire una query – posso avere WAITFOR farlo per me.
Se sai che c’è un tempo specifico che vuoi aspettare fino a quando non inizi a eseguire il ping di un processo, puoi incorporare WAITFOR TIME per rendere il tuo controllo ancora più intelligente:
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