Jak Vytvořit SQL Server Jednat Jako Lidská Pomocí WAITFOR
Foto Fischer Dvojčata na Unsplash
pravděpodobně Jste naladit vaše dotazy pro maximální výkon. Jste hrdí na to, že jak přidat indexy a refaktorovat kód, aby se vytlačit každý poslední kapka vašeho serveru výkonnostní potenciál. Rychlost je obvykle král.
to je důvod, proč pravděpodobně nepoužíváte příkaz WAITFOR serveru SQL Server pravidelně-ve skutečnosti je váš celkový dotaz pomalejší .
pomalost však není vždy špatná věc. Dnes vám chci ukázat dva z mých oblíbených způsobů použití příkazu WAITFOR.
podívejte se na video tohoto týdne na YouTube
Obsah tohoto týdne můžete také sledovat na mém kanálu YouTube .
1. Budování člověka
moderní počítače jsou rychlé. Procesory provést miliardy akcí za sekundu, množství RAM výrobci schopni nacpat na tyči zvyšuje pravidelně, a Ssd jsou rychle dělat disk I/O se týká věcí minulosti.
zatímco všechny tyto věci jsou skvělé pro zpracování velkých pracovních zátěží, pohybují počítače dále a dále od „lidské rychlosti“.
ale „lidská rychlost“ je někdy to, co chcete. Možná budete chtít simulovat využití aplikace v databázi nebo zatížení vytvořené analytiky, kteří používají ad hoc dotazy na vašem serveru.
Toto je místo, kde miluji pomocí WAITFOR DELAY – je možné simulovat člověka provádění dotazů velmi 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
Hodit v některých pseudo-náhodné číslo generace a některých if, a máte falešný zatížení serveru, můžete začít používat:
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. Chudák je Service Broker
Service Broker je skvělá funkce v SQL Server. Zvládá zprávy a fronty scénáře opravdu dobře, ale vyžaduje více času nastavení, takže se mi obvykle nelíbí používat ve scénářích, kde potřebuji něco rychlého a špinavého.
Místo toho, aby nastavení Service Broker vědět, kdy některá data je k dispozici, nebo proces je připraven být vyhozen, můžu udělat to samé s WHILE a 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
Fantazie? Č. Praktické? Ano.
už musím kontrolovat tabulku výsledků před spuštěním dotazu – mohu mít WAITFOR to pro mě.
Pokud víte, že je konkrétní čas, který chcete čekat, až začnete ping nějaký proces, můžete začlenit WAITFOR ČAS, aby se váš běžný i více inteligentní.
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