Hogyan lehet az SQL Server úgy viselkedni, mint egy ember a WAITFOR
fotó: Fischer Twins az Unsplash-en
valószínűleg beállítja a lekérdezéseket a maximális teljesítmény érdekében. Büszkék vagyunk arra, hogy tudjuk, hogyan kell hozzáadni indexek és refactor kódot annak érdekében, hogy présel ki minden utolsó csepp a szerver teljesítmény potenciálját. A sebesség általában király.
ezért valószínűleg nem használja rendszeresen az SQL Server WAITFOR parancsát-valójában lassabbá teszi az Általános lekérdezést .
a lassúság azonban nem mindig rossz dolog. Ma szeretném megmutatni neked a waitfor parancs használatának két kedvenc módját.
nézze meg az e heti videót a YouTube-on
az e heti tartalmat a YouTube-csatornámon is megnézheti .
1. Az ember építése
a modern számítógépek gyorsak. A CPU-k másodpercenként több milliárd műveletet hajtanak végre, a RAM-gyártmányok mennyisége rendszeresen növekszik a botra, az SSD-k pedig gyorsan teszik az I/O lemezt a múlt dolgává.
míg ezek a dolgok nagyszerűek a nagy munkaterhelések feldolgozásához, a számítógépeket egyre távolabb helyezik az “emberi sebességtől”.
de az” emberi sebesség ” néha az, amit akarsz. Lehet, hogy szimulálni szeretné az alkalmazás használatát az adatbázisban, vagy az elemzők által létrehozott terhelést, amely ad hoc lekérdezéseket futtat a szerver ellen.
Ez az, ahol szeretem a WAITFOR DELAY – képes szimulálni az emberek végrehajtó lekérdezések rendkívül 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
dobja néhány psuedo-véletlen szám generáció, és néhány, ha nyilatkozatok, és van egy hamis szerver terhelés lehet kezdeni a:
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. Szegény ember Service Broker
Service Broker egy nagy funkció az SQL Server. Nagyon jól kezeli az üzenetküldést és a sorban állást, de több beállítási időt igényel, így általában nem szeretem használni olyan helyzetekben, amikor valami gyorsra és piszkosra van szükségem.
ahelyett, hogy létre szolgáltatási bróker tudni, ha néhány adat áll rendelkezésre, vagy egy folyamat készen áll, hogy elindult, tudom csinálni ugyanezt a WHILE loop és a WAITFOR:
Fancy? Nem. Gyakorlatias? Igen.
már nem kell ellenőriznem egy táblázatot az eredményekről, mielőtt lekérdezést futtatnék-erre várhatok.
Ha tudja, hogy egy adott időpontban meg akarod várni, amíg elkezd pingelni valamilyen folyamat, akkor bele VÁRNOM IDEJE, hogy a megnéztem még intelligensebb:
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