Wählen Sie Query VS View aus

Im Allgemeinen aggregieren wir Transaktionsdaten zu einer Tabelle mit SQL Job periodisch. Jetzt braucht der Kunde Live-data, also 1 Stunde oder Stunde ist zu hoch. Anstatt den Job in wenigen Minuten auszuführen, schlagen Team vor, eine view zu erstellen, die die Logik zur Auswahl von data aus der Transaktionstabelle selbst enthält.

Aber meine Verwirrung ist jede leistungsbezogene Differenz zwischen select query und View. Das Setzen von data in einer aggregierten Tabelle auf eine periodica Weise und wählen Sie aus dieser Aggregation ist einfach, weil 1. Es hat keine Auswirkungen auf die wichtigsten Tabellen

Direktauswahl in Direkttransaktionen Tabellen beeinflussen Insertionen, wie es häufig passiert. Wenn ich eine view schaue, denke ich, dass das Konzept selbe ist wie select-statement. Jetzt wählen wir auch aus den Haupttischen. Oder mein Verständnis ist falsch?

Bitte schlagen Sie den besten Ansatz für diese und warum

Wenn ich eine view schaue, denke ich, dass das Konzept selbe ist wie select-statement

Richtig, ein Blick in seiner einfachsten Form ist nichts weiter als gespeicherte Abfrage Definition. Wenn diese view in einer Abfrage verwendet wird, wird die Definition in die äußere Abfrage erweitert und entsprechend optimiert. Es gibt keinen performancesvorteil. Dies gilt natürlich nicht für indizierte viewen, bei denen die view im Wesentlichen zu einer eigenen Tabelle wird und die Verwendung des NOEXPAND Abfrage-Hinweises die Definition, die erweitert wird, stoppt und einfach aus dem Index der view lesen wird. Da dies eine Aggregationsabfrage ist, obwohl ich vermute, dass eine indizierte view nicht einmal möglich ist, kümmere dich niemals um eine tragfähige Lösung.

Der nächste Teil über eine Tabelle, um die Aggregation zu speichern ist schwieriger zu beantworten. Ja, das könnte performance, aber auf Kosten der nicht bis zu den Minuten data, und auch die Tabelle zu halten. Ob dies eine passende Lösung ist, hängt ganz von Ihren Bedürfnissen ab, wie aktuell die data sein müssen, wie oft es nötig ist, wie lange es dauert, bis (a) die Reporting-Tabelle zu füllen (b) die Abfrage auf eigene Faust auszuführen .

Zum Beispiel, wenn es 20 Sekunden dauert, um die Abfrage auszuführen, aber es wird nur zweimal am Tag benötigt, dann gibt es keinen Punkt, der diese Abfrage jede Stunde ausführt, um eine Berichtstabelle zu pflegen, um eine Abfrage zu unterstützen, die zweimal täglich ausgeführt wird.

Eine weitere Option könnte diese Berichterstattungstabelle durch Trigger aufrechterhalten, dh wenn eine Zeile eingefügt / aktualisiert wird, kaskade die Änderung in die Reporting-Tabelle dort und dann würde dies die Reporting-Tabelle auf dem neuesten Stand machen, aber wieder, wenn Sie Millionen von transactions pro Tag und den Bericht ein paar Mal, müssen Sie abwägen, wenn die zusätzliche Overhead Ursache durch den Auslöser ist es wert.

Sie können die Auswirkungen auf die Schreiboperationen reduzieren, indem Sie eine Transaktionsisolationsstufe von READ UNCOMMITTED für das SELECT , aber wie bei der Übersichtstabelle-Option kommt dies auf die Kosten für die bis zu den zweiten genauen Informationen, da Sie unbestätigte transactions lesen werden .

Eine endgültige Option könnte eine Zwischenoption sein, eine zusammenfassende Tabelle täglich erstellen und Ihre Haupttabelle nach date partitionieren / indexieren, dann kannst du die Zusammenfassung aus historischen data aus der täglich erstellten Tabelle erhalten und diese mit nur den heutigen data verknüpfen relativ schnell mit den richtigen indizes.

Ein guter Ansatz ist es, die view zu erstellen und Ihre DB zu profilieren. Ja der beste path, um zu überprüfen, ob die view eine gute Lösung ist, es zu schaffen und die Ergebnisse zu testing.

Eine ähnliche Frage wurde hier gefragt: Ist eine view schneller als eine einfache Abfrage?