Articles

Jak Vytvořit SQL Server Jednat Jako Lidská Pomocí WAITFOR

fischer-dvojčata-396836 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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *