Articles

Wie man SQL Server dazu bringt, sich wie ein Mensch zu verhalten, indem man WAITFOR

fischer-twins-396836 Photo by Fischer Twins on Unsplash

Sie stimmen Ihre Abfragen wahrscheinlich auf maximale Leistung ab. Sie sind stolz darauf zu wissen, wie Sie Indizes und Refactor-Code hinzufügen, um das Leistungspotenzial Ihres Servers bis zum letzten Tropfen auszuschöpfen. Geschwindigkeit ist normalerweise König.

Aus diesem Grund verwenden Sie den Befehl WAITFOR von SQL Server wahrscheinlich nicht regelmäßig – dadurch wird Ihre gesamte Abfrage langsamer ausgeführt.

Langsamkeit ist jedoch nicht immer schlecht. Heute möchte ich Ihnen zwei meiner Lieblingsmethoden für die Verwendung des WAITFOR-Befehls zeigen.

Sehen Sie sich das Video dieser Woche auf YouTube an

Sie können den Inhalt dieser Woche auch auf meinem YouTube-Kanal ansehen .

1. Einen Menschen bauen

Moderne Computer sind schnell. CPUs führen Milliarden von Aktionen pro Sekunde aus, die Menge an RAM, die Sie auf einen Stick stopfen können, nimmt regelmäßig zu, und SSDs machen Disk-E / A-Probleme schnell der Vergangenheit an.

All diese Dinge eignen sich zwar hervorragend für die Verarbeitung großer Workloads, entfernen Computer jedoch immer weiter von der „menschlichen Geschwindigkeit“.

Aber „menschliche Geschwindigkeit“ ist manchmal das, was Sie wollen. Möglicherweise möchten Sie die App-Nutzung in Ihrer Datenbank oder die Last simulieren, die von Analysten verursacht wird, die Ad-hoc-Abfragen für Ihren Server ausführen.

Hier liebe ich WAITFOR DELAY – es kann Menschen simulieren, die Abfragen sehr gut ausführen:

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

Werfen Sie einige Pseudo-Zufallszahlengenerierung und einige IF-Anweisungen ein, und Sie haben eine gefälschte Serverlast, die Sie verwenden können:

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. Service Broker des armen Mannes

Service Broker ist eine großartige Funktion in SQL Server. Es behandelt Messaging- und Warteschlangenszenarien sehr gut, erfordert jedoch mehr Einrichtungszeit, sodass ich es normalerweise nicht gerne in Szenarien verwende, in denen ich etwas Schnelles und Schmutziges brauche.

Anstatt Service Broker einrichten zu müssen, um zu wissen, wann einige Daten verfügbar sind oder ein Prozess gestartet werden kann, kann ich dasselbe mit einer WHILE-Schleife und einem WAITFOR tun:

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

Lust? Nein. Praktisch? Ja.

Ich muss eine Tabelle nicht mehr ständig auf Ergebnisse überprüfen, bevor ich eine Abfrage ausführe – ich kann WAITFOR das für mich tun lassen.

Wenn Sie wissen, dass es eine bestimmte Zeit gibt, auf die Sie warten möchten, bis Sie einen Prozess anpingen, können Sie WAITFOR TIME integrieren, um Ihre Überprüfung noch intelligenter zu machen:

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.