Articles

Cum se face ca SQL Server să acționeze ca un om folosind WAITFOR

fischer-twins-396836 fotografie de Fischer Twins pe Unsplash

probabil vă reglați interogările pentru performanțe maxime. Vă mândriți să știți cum să adăugați indexuri și cod de refactor pentru a stoarce fiecare ultimă picătură potențialul de performanță al serverului dvs. Viteza este de obicei rege.

De aceea, probabil, nu utilizați comanda WAITFOR SQL Server în mod regulat – de fapt, face ca interogarea generală să ruleze mai lent .

cu toate acestea, lentoarea nu este întotdeauna un lucru rău. Astăzi vreau să vă arăt două dintre modalitățile mele preferate de utilizare a comenzii WAITFOR.

Urmăriți videoclipul din această săptămână pe YouTube

de asemenea, puteți viziona conținutul din această săptămână pe canalul meu YouTube .

1. Construirea unui om

computerele moderne sunt rapide. Procesoarele efectuează miliarde de acțiuni pe secundă, cantitatea de producători de RAM se poate înghesui pe un stick crește în mod regulat, iar SSD-urile fac rapid ca I/o-ul discului să se refere la un lucru din trecut.

în timp ce toate aceste lucruri sunt excelente pentru procesarea încărcărilor mari de lucru, ele mută computerele din ce în ce mai departe de „viteza umană”.

dar „viteza umană” este uneori ceea ce vrei. Poate doriți să simulați utilizarea aplicației în baza de date sau încărcarea creată de analiștii care rulează interogări ad-hoc pe serverul dvs.

Acest lucru este în cazul în care îmi place folosind WAITFOR întârziere – se poate simula oameni de executare interogări extrem de 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

arunca în unele generație număr psuedo-aleatoare și unele dacă declarații, și aveți o sarcină server fals puteți începe să utilizați:

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. Brokerul de servicii Poor Man

brokerul de servicii este o caracteristică excelentă în SQL Server. Se ocupă de mesaje și scenarii de așteptare foarte bine, dar necesită mai mult timp de configurare, așa că de obicei nu-mi place să-l folosesc în scenarii în care am nevoie de ceva rapid și murdar.

în loc de a fi nevoie să înființeze Broker de servicii pentru a ști când unele date sunt disponibile sau un proces este gata pentru a fi început, pot face același lucru cu o buclă în timp ce și 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? Nu. Practic? Da.

nu mai trebuie să verific un tabel pentru rezultate înainte de a rula o interogare – pot să aștept să fac asta pentru mine.

dacă știți că există un anumit timp pe care doriți să așteptați până când începe ping unele proces, puteți încorpora WAITFOR timp pentru a face verificarea chiar mai inteligent:

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *