web-dev-qa-db-de.com

Ist eine Ansicht schneller als eine einfache Abfrage?

Ist ein 

select *  from myView

schneller als die Abfrage selbst, um die Ansicht zu erstellen (um dasselbe ErgebnisSet zu erhalten):

select * from ([query to create same resultSet as myView])

?

Es ist für mich nicht völlig klar, ob die Ansicht eine Art Zwischenspeicherung verwendet, was sie im Vergleich zu einer einfachen Abfrage schneller macht. 

298
JohnIdol

Ja , Ansichten können einen Clustered-Index zugewiesen bekommen, und wenn dies der Fall ist, werden temporäre Ergebnisse gespeichert, die die resultierenden Abfragen beschleunigen können.

Update: Mindestens drei Leute haben mich in diesem Fall abgewählt. Bei allem Respekt denke ich, dass sie einfach falsch sind; Die Microsoft-eigene Dokumentation macht deutlich, dass Views die Leistung verbessern können.

Erstens werden einfache Ansichten vor Ort erweitert und tragen so nicht direkt zu Leistungsverbesserungen bei - das ist richtig. Indizierte Ansichten können jedoch die Leistung drastisch verbessern .

Lassen Sie mich direkt zur Dokumentation gehen:

Nachdem ein eindeutiger Clustered-Index für die Ansicht erstellt wurde, wird die Ergebnismenge der Ansicht sofort materialisiert und im physischen Speicher in der Datenbank gespeichert, wodurch der Aufwand für die Ausführung dieser kostspieligen Operation zur Ausführungszeit verringert wird.

Zweitens können diese indizierten Ansichten funktionieren , auch wenn sie nicht direkt von einer anderen Abfrage referenziert werden , da der Optimierer sie gegebenenfalls anstelle einer Tabellenreferenz verwendet.

Wieder die Dokumentation:

Die indizierte Sicht kann in einer Abfrageausführung auf zwei Arten verwendet werden. Die Abfrage kann direkt auf die indizierte Ansicht verweisen, oder, was noch wichtiger ist, der Abfrageoptimierer kann die Ansicht auswählen, wenn er feststellt, dass die Ansicht einige oder alle der Abfragen im kostengünstigsten Abfrageplan ersetzen kann. Im zweiten Fall wird die indizierte Ansicht anstelle der zugrunde liegenden Tabellen und ihrer normalen Indizes verwendet. Die Ansicht muss in der Abfrage nicht referenziert sein, damit das Abfrageoptimierungsprogramm sie während der Abfrageausführung verwendet. Dadurch können vorhandene Anwendungen von den neu erstellten indizierten Ansichten profitieren, ohne diese Anwendungen zu ändern.

Diese Dokumentation sowie Diagramme mit Leistungsverbesserungen finden Sie hier .

Update 2: Die Antwort wurde mit der Begründung kritisiert, dass es der "Index" ist, der den Leistungsvorteil bietet, nicht die "Ansicht". Dies lässt sich jedoch leicht widerlegen.

Nehmen wir an, wir sind ein Softwareunternehmen in einem kleinen Land. Ich werde Litauen als Beispiel nehmen. Wir verkaufen Software weltweit und speichern unsere Aufzeichnungen in einer SQL Server-Datenbank. Wir sind sehr erfolgreich und haben in ein paar Jahren mehr als 1.000.000 Datensätze. Wir müssen jedoch häufig Verkäufe für Steuerzwecke melden und stellen fest, dass wir in unserem Heimatland nur 100 Kopien unserer Software verkauft haben. Indem wir eine indizierte Ansicht nur der litauischen Datensätze erstellen, können wir die benötigten Datensätze in einem indizierten Cache speichern, wie in der MS-Dokumentation beschrieben. Wenn wir 2008 unsere Berichte für litauische Verkäufe erstellen, durchsucht unsere Abfrage einen Index mit einer Tiefe von nur 7 (Log2 (100) mit einigen nicht verwendeten Blättern). Wenn wir dasselbe ohne VIEW machen und uns nur auf einen Index in der Tabelle verlassen würden, müssten wir einen Indexbaum mit einer Suchtiefe von 21 durchlaufen!

Die Ansicht selbst würde uns eindeutig einen Leistungsvorteil (3x) gegenüber der einfachen Verwendung des Index allein verschaffen. Ich habe versucht, ein reales Beispiel zu verwenden, aber Sie werden feststellen, dass eine einfache Liste der litauischen Verkäufe uns einen noch größeren Vorteil verschaffen würde.

Beachten Sie, dass ich für mein Beispiel nur einen geraden B-Baum verwende. Obwohl ich mir ziemlich sicher bin, dass SQL Server eine Variante eines B-Baums verwendet, kenne ich die Details nicht. Trotzdem gilt der Punkt.

Update 3: Es wurde die Frage gestellt, ob eine indizierte Ansicht nur einen Index verwendet, der auf der zugrunde liegenden Tabelle platziert ist. Mit anderen Worten: "Eine indizierte Ansicht ist nur das Äquivalent eines Standardindex und bietet nichts Neues oder Einzigartiges für eine Ansicht." Wenn dies wahr wäre, wäre die obige Analyse natürlich falsch! Lassen Sie mich ein Zitat aus der Microsoft-Dokumentation bereitstellen, aus dem hervorgeht, warum ich diese Kritik für ungültig oder falsch halte:

Die Verwendung von Indizes zur Verbesserung der Abfrageleistung ist kein neues Konzept. Indizierte Ansichten bieten jedoch zusätzliche Leistungsvorteile, die mit Standardindizes nicht erzielt werden können.

Zusammen mit dem obigen Zitat bezüglich der Persistenz von Daten im physischen Speicher und anderen Informationen in der Dokumentation darüber, wie Indizes für Ansichten erstellt werden, kann man sicher sagen, dass eine indizierte Ansicht nicht Nur eine zwischengespeicherte SQL-Auswahl, die einen für die Haupttabelle definierten Index verwendet. Daher stehe ich weiterhin zu dieser Antwort.

600

Im Allgemeinen wird Nr. Ansichten hauptsächlich aus Gründen der Bequemlichkeit und Sicherheit und nicht zur Verbesserung der Geschwindigkeit verwendet.

Allerdings haben SQL Server 2000 und höher eine spezielle Funktion namens Indizierte Ansichten , die erheblich verbessern kann Leistung, aber Sie müssen indizierte Sichten erstellen, die einem sehr spezifischen Satz von Richtlinien folgen.

In der Onlinedokumentation gibt es einen wichtigen Verweis in Bezug auf view resolution .

In diesem Artikel werden die Vorteile von und das Erstellen von indizierten Ansichten beschrieben:

Microsoft® SQL Server ™ unterstützt seit vielen Jahren die Erstellung virtueller Tabellen, die als Ansichten bezeichnet werden. In der Vergangenheit dienten diese Ansichten hauptsächlich folgenden Zwecken:

  • Bereitstellung eines Sicherheitsmechanismus, der Benutzer auf eine bestimmte Teilmenge von Daten in einer oder mehreren Basistabellen beschränkt.

  • Bereitstellung eines Mechanismus, mit dem Entwickler anpassen können, wie Benutzer die in Basistabellen gespeicherten Daten logisch anzeigen können.

Mit SQL Server 2000 wurde die Funktionalität von SQL Server-Ansichten erweitert, um die Systemleistung zu verbessern. Es ist möglich, einen eindeutigen Clustered-Index für eine Ansicht sowie nicht-Clustered-Indizes zu erstellen, um die Datenzugriffsleistung für die komplexesten Abfragen zu verbessern. In SQL Server 2000 und 2005 wird eine Ansicht mit einem eindeutigen Clustered-Index als indizierte Ansicht bezeichnet.

41
BradC

Zumindest in SQL Server werden Abfragepläne sowohl für Ansichten als auch für normale SQL-Abfragen auf der Grundlage der Abfrage-/Ansichtsparameter im Plancache gespeichert. Für beide werden sie aus dem Cache gelöscht, wenn sie lange genug nicht verwendet wurden und der Speicherplatz für eine andere neu gesendete Abfrage benötigt wird. Wenn dieselbe Abfrage ausgegeben wird, wird sie erneut kompiliert, und der Plan wird wieder in den Cache gestellt. Nein, es besteht kein Unterschied, da Sie dieselbe SQL-Abfrage und dieselbe Ansicht mit derselben Häufigkeit wiederverwenden. 

Offensichtlich ist im Allgemeinen eine Ansicht ihrer Natur nach (Dass jemand dachte, sie sollte oft genug verwendet werden, um sie in eine Ansicht zu verwandeln) eher "wiederverwendet" werden als jede beliebige SQL-Anweisung. 

13
Charles Bretana

EDIT: Ich habe mich geirrt, und Sie sollten sehen Marks Antwort oben.

Ich kann nicht aus Erfahrung mit SQL Server sprechen, aber für die meisten Datenbanken wäre die Antwort nein. Der einzige potenzielle Vorteil, den Sie bei der Verwendung einer Sicht in Bezug auf die Leistung erzielen, besteht darin, dass möglicherweise Zugriffspfade basierend auf der Abfrage erstellt werden. Der Hauptgrund für die Verwendung einer Sicht ist jedoch die Vereinfachung einer Abfrage oder die Standardisierung des Zugriffs auf einige Daten in einer Tabelle. Im Allgemeinen erhalten Sie keinen Leistungsvorteil. Ich kann mich jedoch irren. 

Ich würde mir ein etwas komplizierteres Beispiel einfallen lassen und es mal selbst sehen.

12
Ryan Guill

Es kann schneller sein, wenn Sie eine materialisierte Ansicht erstellen (mit Schemabindung). Nicht materialisierte Ansichten werden genauso wie die reguläre Abfrage ausgeführt.

4
Otávio Décio

Ich verstehe, dass eine Ansicht vor einiger Zeit schneller wäre, da SQL Server einen Ausführungsplan speichern konnte und ihn dann einfach verwenden konnte, anstatt zu versuchen, sofort einen Überblick zu erhalten. Ich denke, dass die Leistungssteigerungen heutzutage wahrscheinlich nicht mehr so ​​groß sind wie früher, aber ich würde vermuten, dass es eine geringfügige Verbesserung geben würde, um die Ansicht zu nutzen.

4
E.J. Brennan

Eine Ansicht ist definitiv besser als eine geschachtelte Abfrage für SQL Server. Ohne genau zu wissen, warum es besser ist (bis ich den Beitrag von Mark Brittingham gelesen habe), hatte ich einige Tests durchgeführt und hatte fast schockierende Leistungsverbesserungen bei der Verwendung einer Ansicht im Vergleich zu einer verschachtelten Abfrage. Nachdem die jeweilige Version der Abfrage mehrere hundert Mal hintereinander ausgeführt wurde, war die Ansichtsversion der Abfrage in der Hälfte der Zeit abgeschlossen. Ich würde sagen, das ist ein Beweis für mich.

2
Jordan

Ich würde erwarten, dass die beiden Abfragen identisch funktionieren. Eine Sicht ist nichts anderes als eine gespeicherte Abfragedefinition, es gibt kein Zwischenspeichern oder Speichern von Daten für eine Sicht. Der Optimierer wandelt Ihre erste Abfrage effektiv in Ihre zweite Abfrage um, wenn Sie sie ausführen.

2
Tony Andrews

Es gibt keinen praktischen Unterschied, und wenn Sie BOL lesen, werden Sie feststellen, dass Ihr normales altes SQL SELECT * FROM X Plancaching usw. ausnutzt.

0
keithwarren7

Die Speicherung des Ausführungsplans sollte etwas trivial sein, wird aber vernachlässigbar sein.

0
JosephStyons

Es hängt alles von der Situation ab. MS SQL Indizierte Ansichten sind schneller als normale Ansichten oder Abfragen, indizierte Ansichten können jedoch nicht in einer gespiegelten Datenbankumgebung (MS SQL) verwendet werden.

Eine Ansicht in irgendeiner Art von Schleife führt zu einer erheblichen Verlangsamung, da die Ansicht bei jedem Aufruf in der Schleife erneut aufgefüllt wird. Gleich wie eine Abfrage. In dieser Situation ist eine temporäre Tabelle, die # oder @ verwendet, um Ihre Daten zum Durchschleifen zu halten, schneller als eine Ansicht oder Abfrage.

Es hängt also alles von der Situation ab.

0
Dasboot

Der Zweck einer Ansicht besteht darin, die Abfrage immer wieder zu verwenden. Zu diesem Zweck stellen SQL Server, Oracle usw. normalerweise eine "zwischengespeicherte" oder "kompilierte" Version Ihrer Ansicht bereit, wodurch ihre Leistung verbessert wird. Im Allgemeinen sollte dies besser sein als eine "einfache" Abfrage. Wenn die Abfrage jedoch wirklich sehr einfach ist, sind die Vorteile möglicherweise zu vernachlässigen.

Wenn Sie nun eine komplexe Abfrage durchführen, erstellen Sie die Ansicht.

0
CAReed

Die Auswahl aus einer Ansicht oder aus einer Tabelle macht nicht viel Sinn.

Natürlich, wenn die View keine unnötigen Joins, Felder usw. enthält. Sie können den Ausführungsplan Ihrer Abfragen, Joins und Indizes überprüfen, die zur Verbesserung der View-Leistung verwendet werden.

Sie können sogar einen Index für Ansichten erstellen, um die Suchanforderungen zu beschleunigen. http://technet.Microsoft.com/de-de/library/cc917715.aspx

Wenn Sie jedoch nach "% ...%" suchen, profitiert die SQL-Engine nicht von einem Index für die Textspalte. Wenn Sie Ihre Benutzer dazu zwingen können, Suchanfragen wie '...%' durchzuführen, wird das schnell gehen

verwies auf die Antwort in den asp-Foren: https://forums.asp.net/t/1697933.aspx?Weriger+ist+schneller+wenn+sig+Select+query+VIEW+or+Table+

0

Meiner Ansicht nach ist die Verwendung der Ansicht etwas schneller als eine normale Abfrage. Meine gespeicherte Prozedur dauerte etwa 25 Minuten (mit anderen größeren Datensätzen und mehreren Joins) und nach der Verwendung der Ansicht (nicht gruppiert) war die Leistung nur ein wenig schneller, jedoch nicht signifikant. Ich musste einige andere Abfrageoptimierungstechniken/-methoden verwenden, um eine dramatische Änderung vorzunehmen.

0
kta