Frage

Wenn ich eine Tabelle, die Zehntausende von Datensätzen von Konten für mehrere Standorte enthält.

Gibt es eine Geschwindigkeitsdifferenz, wenn ich eine Ansicht, die Abfrage alle Konten für einen bestimmten Ort und eine gespeicherte Prozedur, die mit derselben SQL-Anweisung wählt?

EDIT: Ich lief über diese materialisierten Ansicht. Es scheint, als wäre dies immer verwendet werden.

Wann möchten Sie wollen ein Geschäft Prozedur, Ansicht verwenden, und materialisierte Ansicht? Welche Vor- und Nachteile haben Sie im Auge behalten möchten, wenn Sie diese Entscheidung treffen?

War es hilfreich?

Lösung

Kurze Antwort: "Es kommt darauf an"

Lange Antwort: „Es hängt von der Form der Abfrage“

Wie bei jeder Frage über die Leistung in SQL Server (was besser ist: x gegen y), gibt es keine richtige Antwort. Im Fall von Ansichten vs. sprocs, gibt es keine Möglichkeit, zuverlässig vorherzusagen, welche sein wird schneller (falls vorhanden), kurz die Abfrage von Profilierungs.

Ich habe beide schneller gesehen, und es ist überliefert, wie die Ansicht der verwendet wurde und ob es sich um ein Teil eines größeren Abfrage. Ich habe auch langsame Abfragen nach unten gesehen Ansichten, weil sie viel Komplexität verbergen kann, dass die Abfrage die Ansicht verwenden, müssen nicht wirklich.

Sie müssen beurteilen, was Sie erreichen wollen: Wenn alles, was Sie tun Zugang Zeilen in der Tabelle zu wollen, und Sie gehen zu wollen, nicht die Ausgabe als Teil einer anderen Abfrage verwenden, würde ich wählen Sie eine gespeicherte Prozedur, vor allem, wenn die Abfrage für die Tabelle eine WHERE-Klausel nehmen wird.

Wohin geht die Abfrage aus aufgerufen werden? Ein weiterer Teil der SQL? Einige Anwendungs-Framework? Eine benutzerdefinierte Datenzugriffsschicht? Es lohnt sich darüber nachzudenken, wie der aufrufende Code die Abfrage zusammen stellen wird, da dies beeinflussen können, wie SQL Server up-Caching endet und die Wiederverwendung der Ausführungsplan. Wenn es nur eine Reihe von dynamischen SQL-Schrauben zusammen, dann kann die Leistung leidet etwas wie SQL Server müssen möglicherweise dem Abfrage-Plan jedes Mal neu zu erstellen; so in diesem Fall ein sproc hat den Vorteil, mit einem zwischengespeicherten Plan. Wenn die Zugriffsschicht intelligent ist und nicht parametrisiert dynamische SQL, gibt es nicht so viel sein kann darin.

Fazit: verstehen, was Sie erreichen wollen. Dann Profil, Melodie, zwicken, und wiederholen, bis zufrieden.

Andere Tipps

Eine Ansicht und eine gespeicherte Prozedur sowohl in die Datenbank kompiliert werden, so dass sie schneller als eine direkte Abfrage sind, wird die Geschwindigkeitsdifferenz zwischen ihnen, wenn Sie dynamische Parameter haben müssen. Die Ansichten sie einfach nicht akzeptieren.

Jeder hat seinen eigenen spezifischen Gebrauch. Ansichten können auch in anderen Fragen oder Views, Stored Procedures nur ausgeführt werden, kann verwendet werden. Aber zu Ihrer Frage mit der gleichen SELECT * FROM sie haben genau die gleiche Geschwindigkeit.

Ja und nein.

Eine Ansicht ist eine Abfragedefinition, die grundsätzlich an Ort und Stelle ersetzt wird, wenn verwendet, und es wird in die Abfrage kompiliert, die die Sicht verweist. Das bedeutet, dass die tatsächliche Ausführung hängt von der Abfrage, die die Sicht verweist . Wenn die Abfrage ein gerade nach vorne SELECT * FROM view ist, dann wird dies ziemlich viel genau der gleiche Ausführungsplan als gleichwertiges Verfahren. Wenn jedoch die Abfrage SELECT onefield FROM view die die Abfrage deutlich anders. Es gibt keine gleichwertigen Verfahren, und diese Abfrage durchführen kann wesentlich besser wegen der reduzierten Projektionsliste.

Es gibt auch große Benutzerfreundlichkeit diferences. Eine gespeicherte Prozedur kann nur ausgeführt werden. Eine Ansicht kann ausgewählt werden aus und verwendet mit mehreren anderen Aussagen wie beitritt, Unterabfragen und dergleichen.

die viel bessere Flexibilität der Ansichten gegeben, es sei denn kein anderer Faktor eine Rolle spielt, dann wird ein Verfahren nur dann sinnvoll, wenn Sie Parameter haben, da Ansichten können keine Parameter haben.

Die anserws auf diese Post nützlichen Hintergrund für indizierte bieten wird (materialisiert) Ansichten in SQL Server.

Ich habe auch jede schneller sein als die andere gesehen, je nach Kontext.

Die allgemeine Faustregel gilt: Ich folge ist: Wenn die Ansicht, die einen Komplex, in dem hat, auf anderen mäßig komplexen Ansichten hängt oder ist das Ergebnis einer UNION [ALL], dann mit ziemlicher Sicherheit SQL S. wird richtig nicht in der Lage sein, propagieren WHERE den ganzen Weg hinunter zu den einzelnen Tabellen auf die Ansicht angewendet Bedingungen, so an einem Punkt, den Sie Table Scans bekommen beginnen werden (es sei denn es eine materialisierte Ansicht ist) oder Ihre Ausführungspläne werden viel komplexer (und langsam) als das, was sie sein könnte.

In diesen Fällen besser für eine proc gehen. Und wie andere gesagt haben, immer das Profil!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top