Articles

Hur man gör SQL Server agera som en människa genom att använda WAITFOR

fischer-twins-396836 foto av Fischer Twins på Unsplash

du förmodligen ställa dina frågor för maximal prestanda. Du är stolt över att veta hur man lägger till index och refactor-kod för att pressa ut varje sista droppe serverns prestandapotential. Hastighet är vanligtvis kung.

det är därför du förmodligen inte använder SQL Servers WAITFOR – kommando regelbundet-det gör faktiskt din övergripande fråga långsammare .

men långsamhet är inte alltid en dålig sak. Idag vill jag visa dig två av mina favorit sätt att använda WAITFOR-kommandot.

titta på veckans video på YouTube

Du kan också titta på veckans innehåll på min YouTube-kanal .

1. Att bygga en människa

moderna datorer är snabba. CPU: er utför miljarder Åtgärder per sekund, mängden RAM-tillverkare kan klämma fast på en pinne ökar regelbundet, och SSD: er gör snabbt disk I/O-problem till det förflutna.

medan alla dessa saker är bra för att bearbeta stora arbetsbelastningar, flyttar de datorer längre och längre bort från ”mänsklig hastighet”.

men ”mänsklig hastighet” är ibland vad du vill. Kanske vill du simulera appanvändning i din databas eller belastningen som skapats av analytiker som kör ad hoc-frågor mot din server.

det är här Jag älskar att använda WAITFOR DELAY – det kan simulera människor som utför frågor extremt 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

kasta in några psuedo-slumptalsgenerering och några om uttalanden, och du har en falsk serverbelastning du kan börja använda:

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. Dålig mans Service Broker

Service Broker är en bra funktion i SQL Server. Den hanterar meddelanden och kö scenarier riktigt bra, men kräver mer installationstid så jag brukar inte gillar att använda den i scenarier där jag behöver något snabbt och smutsigt.

istället för att behöva ställa in Service Broker för att veta när vissa data är tillgängliga eller en process är redo att sparkas av, kan jag göra detsamma med en While loop och en 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? Nej. Praktiskt? Ja.

inte längre behöver jag hålla kontrollera en tabell för resultat innan jag kör en fråga-jag kan ha WAITFOR göra det för mig.

Om du vet att det finns en viss tid du vill vänta tills du börjar Pinga någon process, kan du införliva WAITFOR tid att göra din kontroll ännu mer intelligent:

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *