Articles

Jak sprawić, by SQL Server działał jak człowiek, używając WAITFOR

Fischer-twins-396836 Zdjęcie Fischer Twins na Unsplash

prawdopodobnie dostroisz swoje zapytania, aby uzyskać maksymalną wydajność. Jesteś dumny z tego, że wiesz, jak dodawać indeksy i Kod refaktorowy, aby wycisnąć z każdej ostatniej kropli potencjał wydajności serwera. Prędkość jest zwykle królem.

dlatego prawdopodobnie nie używasz regularnie polecenia WAITFOR SQL Server – w rzeczywistości powoduje to, że Twoje ogólne zapytanie działa wolniej .

jednak powolność nie zawsze jest czymś złym. Dzisiaj chcę wam pokazać dwa z moich ulubionych sposobów korzystania z polecenia WAITFOR.

Obejrzyj filmik z tego tygodnia na YouTube

możesz też obejrzeć filmik z tego tygodnia na moim kanale YouTube .

1. Budowa człowieka

współczesne komputery są szybkie. Procesory wykonują miliardy działań na sekundę, ilość pamięci RAM, którą producenci mogą wcisnąć na drążek, regularnie wzrasta, a dyski SSD szybko sprawiają, że we/wy dysków należy już do przeszłości.

podczas gdy wszystkie te rzeczy są świetne do przetwarzania dużych obciążeń, przenoszą Komputery coraz dalej od „ludzkiej szybkości”.

ale” ludzka prędkość ” jest czasem tym, czego chcesz. Może chcesz symulować użycie aplikacji w bazie danych lub obciążenie utworzone przez analityków uruchamiających zapytania ad hoc na twoim serwerze.

tutaj uwielbiam używać WAITFOR DELAY – może on symulować ludzi wykonujących zapytania bardzo dobrze:

-- 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

dorzuć trochę generowania liczb losowych psuedo i kilka instrukcji IF, a masz fałszywe obciążenie serwera, możesz zacząć używać:

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. Poor Man ’ s Service Broker

Service Broker To świetna funkcja w SQL Server. Radzi sobie z komunikatami i scenariuszami kolejkowymi naprawdę dobrze, ale wymaga więcej czasu konfiguracji, więc zwykle nie lubię go używać w scenariuszach, w których potrzebuję czegoś szybkiego i brudnego.

zamiast skonfigurować brokera usług, aby wiedzieć, kiedy niektóre dane są dostępne lub Proces jest gotowy do uruchomienia, mogę zrobić to samo z pętlą WHILE I czekaniem:

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

masz ochotę? Nie. Praktyczne? Tak.

nie muszę już sprawdzać tabeli wyników przed uruchomieniem zapytania-mogę to zrobić za mnie.

Jeśli wiesz, że jest określony czas, na który chcesz czekać, aż zaczniesz pingować jakiś proces, możesz włączyć czas oczekiwania, aby Twoje sprawdzanie było jeszcze bardziej inteligentne:

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *