Ich habe ein interessantes Delimma. Ich habe eine sehr teure Abfrage, bei der mehrere vollständige Tabellen-Scans und teure Joins durchgeführt werden, sowie das Aufrufen einer skalaren UDF, die einige Geodaten berechnet.Mit einer Cache-Tabelle in SQLServer, bin ich verrückt?
Das Endergebnis ist eine Ergebnismenge, die Daten enthält, die dem Benutzer angezeigt werden. Ich kann jedoch nicht alles zurückgeben, was ich dem Benutzer in einem Aufruf zeigen möchte, da ich das ursprüngliche Resultset in Seiten unterteile und nur eine bestimmte Seite zurückgebe. Außerdem muss ich das ursprüngliche gesamte Dataset übernehmen und Gruppen nach Joins und Joins anwenden usw. zur Berechnung der zugehörigen Aggregatdaten.
Lange Rede, kurzer Sinn, um alle Daten, die ich brauche, an die Benutzeroberfläche zu binden, muss diese teure Abfrage etwa 5-6 Mal aufgerufen werden.
Also fing ich an, darüber nachzudenken, wie ich diese teure Abfrage einmal berechnen konnte, und dann konnte jeder nachfolgende Aufruf irgendwie gegen eine zwischengespeicherte Ergebnismenge ziehen.
Ich kam auf die Idee, die Abfrage in eine gespeicherte Prozedur zu abstrahieren, die eine CacheID (Guid) als Nullable-Parameter aufnehmen würde.
Dieser Sproc würde die Ergebnismenge in eine Cache-Tabelle einfügen, die die cacheID verwendet, um diese spezifische Ergebnismenge eindeutig zu identifizieren.
Dadurch können Sprocs, die an dieser Ergebnismenge arbeiten müssen, eine cacheID von einer vorherigen Abfrage übergeben, und es ist eine einfache SELECT-Anweisung zum Abrufen der Daten (mit einer einzelnen WHERE-Klausel auf der cacheID).
Dann spülen Sie die Cache-Tabelle mit einem periodischen SQL-Job aus.
Dies funktioniert gut und beschleunigt wirklich Dinge auf Zero-Load-Tests. Ich bin jedoch besorgt, dass diese Technik ein Problem unter Last mit großen Mengen von Lese- und Schreibvorgängen gegen die Cache-Tabelle verursachen kann.
Also, lange Geschichte kurz, bin ich verrückt? Oder ist das eine gute Idee?
Offensichtlich muss ich besorgt sein über Sperrkonflikt und Indexfragmentierung, aber alles andere, worüber man sich Sorgen machen sollte?
Dann müsste ich Tausende von Ergebnissen zurück zur App leiten? – FlySwat
Um dies auszuarbeiten, führe ich viele SQL-Operationen mit diesen Daten durch und sende die Ergebnisse einfach an die App. Das Caching in der App wäre kontraproduktiv. – FlySwat
@FlySwat, Ich denke, dass die Einführung eines Vermittlers für diese Überlegung eine Überlegung wert ist. Sie möchten Ihre DB nicht jedes Mal in einen Fit schicken, wenn ein lang laufender Bericht ausgeführt wird. Ein Dienst in der Mitte wird Ihnen die Möglichkeit geben drosseln und die Last auf der DB reduzieren –