Planen von Benachrichtigungen

Um eine effektive Verwendung von Abfragebenachrichtigungen zu gewährleisten, sollten Sie überlegen, ob Ihre Anwendung von Abfragebenachrichtigungen profitieren kann, ob die von Ihrer Anwendung verwendeten Abfragen Benachrichtigungen unterstützen und welche Strategie Ihre Anwendung zum Abonnieren und Empfangen von Benachrichtigungen verwenden soll.

Abfragebenachrichtigungen stellen ein bequemes Verfahren zum Verringern der Roundtrips zur Datenbank dar, wenn sich die Daten in der Abfrage relativ unregelmäßig ändern, wenn die Anwendung keine sofortige Aktualisierung verlangt, wenn sich die Daten ändern und wenn die Abfrage die unter Erstellen einer Abfrage für die Benachrichtigung beschriebenen Anforderungen und Einschränkungen erfüllt. Zahlreiche internetbasierte Anwendungen erfüllen diese Kriterien, und diese Anwendungen können von Abfragebenachrichtigungen profitieren.

Nicht in jedem Szenario sind Abfragebenachrichtigungen von Vorteil. Abfragebenachrichtigungen eignen sich in Situationen, wenn eine Anwendung häufig Daten aus der Datenbank liest, Aktualisierungen der Daten jedoch relativ unregelmäßig stattfinden. Eine Onlinekataloganwendung wird z. B. häufiger angezeigt, als der Katalog aktualisiert wird. Für einen Onlinewarenkorb kann der Inhalt einer Abfrage jedoch relativ häufig aktualisiert werden, daher bieten Abfragebenachrichtigungen weniger Vorteile.

Abfragebenachrichtigungen sind effizienter, wenn eine Anwendung Abfragen ausgibt, die eine gemeinsame Struktur besitzen und sich nur in den Werten der Parameter unterscheiden. Beispiel:

SELECT ProductNumber, Name FROM Production.Product WHERE ListPrice < 300
SELECT ProductNumber, Name FROM Production.Product WHERE ListPrice < 500

In diesem Fall verwenden die Abfragebenachrichtigungsabonnements für beide Benachrichtigungen die gleiche interne Vorlage gemeinsam und erfordern daher weniger Aufwand in SQL Server als zwei Benachrichtigungen mit einer unterschiedlichen Abfragestruktur. Beachten Sie jedoch, dass die Parameter in den Abfragen erhalten bleiben. Obwohl die Abfragen die gleiche Vorlage gemeinsam verwenden, bewirkt das Hinzufügen eines Elements mit einem ListPrice von 350 eine Benachrichtigung für die zweite Abfrage, nicht jedoch für die erste.

Wenn Abfragebenachrichtigungen für eine Tabelle aktiv sind, sind Aktualisierungen der Tabelle aufwendiger. Database Engine (Datenbankmodul) muss zusätzliche Arbeiten ausführen, um die Abonnements zu überprüfen und ggf. Benachrichtigungen zu generieren. Das Wiederverwenden interner Vorlagen minimiert den Aufwand pro Abonnement. Aus diesem Grund sollten Sie Abfragebenachrichtigungen nur für Anwendungen verwenden, die Abfragen mit einer ähnlichen Struktur übermitteln. Eine Anwendung, die Abfragen mit unterschiedlichen Strukturen übermittelt, sollte keine Abfragebenachrichtigungen verwenden.

Eine Abfrage, die Katalogelemente in einem bestimmten Preisbereich anzeigt, übermittelt z. B. Abfragen mit der gleichen Struktur. In diesem Fall kann Database Engine (Datenbankmodul) die interne Vorlage für jede Abfrage wiederverwenden, und Abfragebenachrichtigungen optimieren möglicherweise die Leistung. Eine Abfrage, die Ad-hoc-Berichte ermöglicht, übermittelt jedoch Abfragen mit einer unterschiedlichen Struktur. In diesem Fall sollte die Anwendung keine Abfragebenachrichtigungen verwenden.

Database Engine (Datenbankmodul) verwaltet eine interne Vorlage, wenn diese von mindestens einem registrierten Abonnement verwendet wird. Database Engine (Datenbankmodul) schränkt die Anzahl der verschiedenen internen Vorlagen für eine bestimmte Tabelle ein. Sobald dieser Grenzwert erreicht wird, registriert Database Engine (Datenbankmodul) keine weiteren Abonnements, die das Erstellen einer neuen Vorlage bewirken würden. Database Engine (Datenbankmodul) generiert stattdessen sofort eine Abonnementnachricht, die angibt, dass das Abonnement nicht registriert werden konnte.

Planen einer effizienten Abfragebenachrichtigungen-Strategie

Abfragebenachrichtigungen funktionieren im Allgemeinen sehr gut, wenn die Gesamtseitenzahl der Benachrichtigungen gering bis mäßig ist und die Anwendung keine unmittelbare Benachrichtigungsantwortzeit erfordert, wenn sich die Daten ändern. Das typische Webebenen-Cacheaufhebungsszenario entspricht diesem Modell und ist oftmals eine gute Anwendung für den Einsatz von Abfragebenachrichtigungen. Abfragebenachrichtigungen sind möglicherweise nicht die beste Wahl für Anwendungen, wenn Benachrichtigungen in einer Antwortzeit von weniger als einer Sekunde empfangen werden müssen, wenn die Netzwerkinfrastruktur nicht sowohl schnell als auch zuverlässig ist oder wenn das Benachrichtigungsvolumen sehr hoch ist.

Wenn Sie Abfragebenachrichtigungen verwenden, testen und optimieren Sie die Anwendung bei der Skalierung und in der Umgebung, in der sie nach der Bereitstellung ausgeführt werden wird. Betrachten Sie das reale Anwendungsfallszenario mit der schwersten erwarteten Last, und berücksichtigen Sie bei der Planung Bursts von hoher Aktivität, wenn diese möglich sind.

Wenn Sie Abfragebenachrichtigungen in einer Situation verwenden, in der Abfragebenachrichtungen zuverlässig in weniger als einer Sekunde benötigt werden, gelten für die Abfragebenachrichtigungen-Anwendung die gleichen Techniken wie für die Erstellung jeder leistungsstarken OLTP-Anwendung.

  • Stellen Sie sicher, dass die Anwendung Sperren nicht länger als einen Sekundenbruchteil aufrechterhält. Führen Sie z. B. keine Transaktionen mit mehreren Anweisungen von einem Client über ein Netzwerk aus, das eine unzuverlässige Leistung bietet.

  • Identifizieren und eliminieren Sie Hotspots in den Benutzerdatentabellen.

  • Die internen Tabellen für Abfragebenachrichtigungen werden häufig sequenziell auf jedes Update an einer zugehörigen Benutzertabelle, auf der Sie Abfragebenachrichtigungen festgelegt haben, überprüft. Wenn die Sperre auf Tabellenebene der internen Tabelle für Abfragebenachrichtigungen zu einem Engpass werden könnte, dann sollten Sie die Benutzertabelle, die die Abfragebenachrichtigung enthält, in mehrere separate Tabellen partitionieren, um die Anzahl an möglichen Benachrichtigungen, die für jede Datenänderung ausgewertet werden müssen, zu verringern.

Wenn die Benachrichtigungsanforderungen eine kurze nützliche Lebensdauer haben, sollten Sie ein Timeout mit dem SqlDependency-Konstruktor verwenden, das erheblich kürzer als die Standardeinstellung von fünf Tagen ist (z. B. eine Minute). Hierdurch kann die Anzahl der Zeilen in internen Tabellen für Abfragebenachrichtigungen eventuell erheblich reduziert werden. Dies kann wiederum die für die Verarbeitung dieser Tabellen erforderliche Zeit und die Sperrkonflikte der Tabellen verringern.

Alternativen zu Abfragebenachrichtigungen

Wenn Sie eine schnelle und leicht vorhersagbare Antwortzeit für Benachrichtigungen zu Datenänderungen in einer Umgebung mit hohen Datenupdateraten und vielen ausstehenden Benachrichtigungsanforderungen benötigen, erwägen Sie alternative Lösungen, etwa eine der nachfolgend aufgeführten.

  • Erstellen Sie einen AFTER UPDATE-Trigger für die überwachte Tabelle, dessen Aktion mithilfe von SQL Server Service Broker eine Nachricht an die Entität sendet, die die Benachrichtigung benötigt. (Dies könnte auf verschiedene Weise realisiert werden, etwa durch Einfügen einer Spalte in die entsprechende Tabelle, die angibt, welche Entität von Änderungen benachrichtigt werden muss, oder durch Verknüpfen der primären Tabelle mit einer zweiten Tabelle, die Informationen zur zu benachrichtigenden Entität enthält.)

  • Verwenden Sie eine benutzerdefinierte Lösung auf Anwendungsebene, die nicht von Abfragebenachrichtigungen abhängig ist. Konfigurieren Sie z. B. eine Benachrichtigung, die vollständig über eine Middlewareanwendung erfolgt, die die überwachten Daten in einer Auflistung von Hauptspeicherobjekten enthält. Die Anwendung kann eine Benachrichtigung generieren, wenn ein Objekt auf eine Weise geändert wird, die die Kriterien für eine Benachrichtigung erfüllt.

  • Verwenden Sie den Windows Server AppFabric-Cache, der einen Mechanismus für Änderungsbenachrichtigungen unterstützt, der auf einem Objektcache im Arbeitsspeicher und auf Rückruffunktionen basiert, die Sie bei den Objekten registrieren.