Miten saada SQL Server toimimaan kuin ihminen käyttämällä WAITFOR
Photo by Fischer Twins on Unsplash
luultavasti virittää kyselyt maksimaalisen suorituskyvyn. Olet ylpeä tietää, miten lisätä indeksejä ja refactor koodi, jotta puristaa ulos joka viimeinen pisara palvelimen suorituskykypotentiaalia. Nopeus on yleensä kuningas.
siksi et luultavasti käytä SQL Serverin WAITFOR – komentoa säännöllisesti-se itse asiassa tekee kyselystäsi hitaamman .
hitaus ei kuitenkaan ole aina huono asia. Tänään haluan näyttää teille kaksi suosikkitapaani WAITFOR-komennon käyttämiseksi.
Katso tämän viikon video YouTubesta
voit katsoa tämän viikon sisältöä myös YouTube-kanavallani .
1. Ihmisen rakentaminen
nykyajan tietokoneet ovat nopeita. Suorittimet suorittavat miljardeja toimia sekunnissa, määrä RAM valmistaa voi ahtaa kiinni kiinni kasvaa säännöllisesti, ja SSD ovat nopeasti tehdä levyn I / O koskee menneisyyteen.
vaikka kaikki nuo asiat ovat erinomaisia suurten työkuormien käsittelyyn, ne siirtävät tietokoneita yhä kauemmas ”ihmisen nopeudesta”.
mutta ”ihmisen nopeus” on joskus sitä, mitä haluaa. Ehkä haluat simuloida sovelluksen käyttöä tietokannassasi tai analyytikoiden luomaa kuormitusta, kun he tekevät ad hoc-kyselyjä palvelimeesi.
Tämä on se, missä rakastan wait for delayn käyttöä – se voi simuloida ihmisten suorittamia kyselyjä erittäin hyvin:
-- 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
heittää mukaan joitain psuedo-satunnaislukujen generointia ja joitakin IF-lausekkeita, ja sinulla on valepalvelinkuorma, jota voit alkaa käyttää:
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. Köyhän miehen Palvelumeklari
Palvelumeklari on SQL Serverin mainio ominaisuus. Se käsittelee messaging ja jonotus skenaarioita todella hyvin, mutta vaatii enemmän asennusaikaa, joten en yleensä pidä käyttää sitä tilanteissa, joissa tarvitsen jotain nopeaa ja likaista.
sen sijaan, että minun pitäisi perustaa Palvelunvälittäjä tietääkseni, milloin jotain dataa on saatavilla tai prosessi on valmis käynnistettäväksi, voin tehdä saman WHILE Loopilla ja odottelulla:
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? Ei. Käytännöllistä? Kyllä.
enää minun ei tarvitse jatkuvasti tarkistaa taulukon tuloksia ennen kuin suoritan kyselyn – voin odottaa tehdä sen minulle.
Jos tiedät, että on tietty aika, jota haluat odottaa, kunnes aloitat jonkin prosessin, voit sisällyttää siihen odotusajan, jotta tarkistamisesi olisi vielä älykkäämpää:
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