Ist eine Ansicht schneller als eine einfache Abfrage?


357

Ist ein

select *  from myView

schneller als die Abfrage selbst, um die Ansicht zu erstellen (um das gleiche Ergebnis zu erhaltenSet):

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

?

Mir ist nicht ganz klar, ob die Ansicht eine Art Caching verwendet, wodurch sie im Vergleich zu einer einfachen Abfrage schneller wird.


7
Ich bin mir bei einer Ansicht nicht sicher, aber verschachtelte Ansichten sind die Hölle der totalen Leistung.
Muflix

Antworten:


678

Ja , Ansichten kann ein Clustered-Index zugewiesen werden. In diesem Fall werden temporäre Ergebnisse gespeichert, die die resultierenden Abfragen beschleunigen können.

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

Erstens werden einfache Ansichten an Ort und Stelle erweitert und tragen so nicht direkt zur Leistungsverbesserung bei - so viel ist wahr. Allerdings indizierte Sichten können dramatisch die Leistung 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 gespart wird.

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

Wieder die Dokumentation:

Die indizierte Ansicht kann auf zwei Arten in einer Abfrageausführung 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 Abfragen im Abfrageplan mit den niedrigsten Kosten 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 werden, damit das Abfrageoptimierungsprogramm sie während der Abfrageausführung verwendet. Auf diese Weise 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 der "Index" den Leistungsvorteil bietet, nicht die "Ansicht". Dies kann jedoch leicht widerlegt werden.

Nehmen wir an, wir sind ein Softwareunternehmen in einem kleinen Land. Ich werde Litauen als Beispiel nehmen. Wir verkaufen weltweit Software und speichern unsere Aufzeichnungen in einer SQL Server-Datenbank. Wir sind sehr erfolgreich und haben in einigen Jahren mehr als 1.000.000 Datensätze. Wir müssen jedoch häufig steuerliche Umsätze melden und stellen fest, dass wir in unserem Heimatland nur 100 Exemplare 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 aufbewahren, 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 tun würden 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 Beispiel aus der Praxis 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 ziemlich sicher bin, dass SQL Server eine Variante eines B-Baums verwendet, kenne ich die Details nicht. Trotzdem gilt der Punkt.

Update 3: Es stellt sich die Frage, ob in einer indizierten Ansicht nur ein Index verwendet wird, der in der zugrunde liegenden Tabelle platziert ist. Das heißt, um es zu paraphrasieren: "Eine indizierte Ansicht entspricht nur einem Standardindex und bietet nichts Neues oder Einzigartiges für eine Ansicht." Wenn dies natürlich wahr wäre, wäre die obige Analyse falsch! Lassen Sie mich ein Zitat aus der Microsoft-Dokumentation zitieren, das zeigt, warum ich diese Kritik für ungültig oder wahr halte:

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

Zusammen mit dem obigen Zitat zur Persistenz von Daten im physischen Speicher und anderen Informationen in der Dokumentation darüber, wie Indizes in Ansichten erstellt werden, kann man mit Sicherheit sagen, dass eine indizierte Ansicht nicht nur eine zwischengespeicherte SQL-Auswahl ist, die zufällig eine verwendet Index in der Haupttabelle definiert. Daher stehe ich weiterhin zu dieser Antwort.


28
Ja, indizierte Ansichten können die Leistung erheblich verbessern. Indizierte Ansichten sind jedoch nicht nur "Ansichten", und im Allgemeinen ist eine normale "Ansicht" nicht schneller als die zugehörigen Abfragen.
BradC

10
@ Charles - es ist egal, ob es der Index ist, die Tatsache, dass eine Ansicht den Index nutzen kann und eine rohe Abfrage nicht ausreicht
annakata

193
/ applaudiere @Mark dafür, dass er sich behauptet und rational argumentiert
annakata

17
Oh Mann, ich habe 8 Downvotes bekommen! Ich bin erstaunt, dass die Leute so schnell abstimmen würden, ohne zumindest Charles 'Mut zu haben, ihren Standpunkt zu argumentieren.
Mark Brittingham

8
Da eine Tabelle nur einen Clusterdee-Index haben kann und Sie einen separaten Clustered-Index für eine Ansicht erstellen können (da die Felder im Clustered-Index auf den Indexseiten unabhängig voneinander beibehalten werden), ist dies ein Cheat (Work-Arounnd?) Mit dieser Option können Sie ZWEI Clustered-Indizes für eine Tabelle abrufen.
Charles Bretana

50

Im Allgemeinen nein.Ansichten werden hauptsächlich aus Gründen der Benutzerfreundlichkeit und Sicherheit verwendet und bieten (für sich) keinen Geschwindigkeitsvorteil.

SQL Server 2000 und höher verfügen jedoch über eine Funktion namens " Indizierte Ansichten" , mit der die Leistung mit einigen Einschränkungen erheblich verbessert werden kann :

  1. Nicht jede Ansicht kann zu einer indizierten Ansicht gemacht werden. sie haben eine folgen bestimmten Satz von Richtlinien , die (unter anderem Einschränkungen) Mittel nicht gemeinsam Query - Elemente wie umfassen kann COUNT, MIN, MAX, oder TOP.
  2. Indizierte Ansichten verwenden physischen Speicherplatz in der Datenbank, genau wie Indizes für eine Tabelle.

Dieser Artikel beschreibt zusätzliche Vorteile und Einschränkungen indizierter Ansichten :

Sie können…

  • Die Ansichtsdefinition kann auf eine oder mehrere Tabellen in derselben Datenbank verweisen.
  • Sobald der eindeutige Clustered-Index erstellt wurde, können zusätzliche Nonclustered-Indizes für die Ansicht erstellt werden.
  • Sie können die Daten in den zugrunde liegenden Tabellen aktualisieren - einschließlich Einfügungen, Aktualisierungen, Löschungen und sogar Kürzungen.

Du kannst nicht ...

  • Die Ansichtsdefinition kann nicht auf andere Ansichten oder Tabellen in anderen Datenbanken verweisen.
  • Es darf keine COUNT-, MIN-, MAX-, TOP-, Outer-Joins oder einige andere Schlüsselwörter oder Elemente enthalten.
  • Sie können die zugrunde liegenden Tabellen und Spalten nicht ändern. Die Ansicht wird mit der Option WITH SCHEMABINDING erstellt.
  • Sie können nicht immer vorhersagen, was der Abfrageoptimierer tun wird. Wenn Sie Enterprise Edition verwenden, wird der eindeutige Clustered-Index automatisch als Option für eine Abfrage betrachtet. Wenn jedoch ein „besserer“ Index gefunden wird, wird dieser verwendet. Sie können den Optimierer zwingen, den Index über den WITH NOEXPAND-Hinweis zu verwenden. Seien Sie jedoch vorsichtig, wenn Sie einen Hinweis verwenden.

3
stimme überhaupt nicht zu ... das Lesen aus einer Ansicht ermöglicht das Umschreiben von SQL ... und es ist im Allgemeinen SCHNELLER, aus einer Ansicht zu lesen (als aus einem Speicherauszug der Ansicht).
Aaron Kempf

@ AaronKempf, ich würde gerne einen Hinweis darauf sehen, das war nicht meine Erfahrung. Wenn ich nach "View SQL rewritten" suche, beziehen sich alle Ergebnisse auf Oracle, nicht auf SQL Server, z. B. docs.oracle.com/cd/E14072_01/server.112/e10810/qrbasic.htm
BradC

Ich habe gestern nur ein Benchmarking durchgeführt. Ich war fassungslos. Wenn ich einen Dump aus einer Ansicht (in eine Tabelle) nehme, ist jede Abfrage, die ich ausführe, langsamer. Weil die meisten Abfragen die Ansicht wie Butter durchlaufen und neu geschrieben werden durch den Abfrageoptimierer .. Zumindest nehme ich das an. Ich werde versuchen, bald einen Blogeintrag darüber zu schreiben. Das Benchmarking war ziemlich faszinierend. Grundsätzlich helfen Ansichten der Leistung enorm.
Aaron Kempf

@AaronKempf Ich bin mir nicht sicher, ob dies überhaupt das gleiche Szenario wie bei der ursprünglichen Frage ist (bei der es um eine Abfrage geht, anstatt diese identische Abfrage in eine Ansicht zu stellen). Wie auch immer, ich kann nicht sehen, wie das Materialisieren einer Ansicht in einer Tabelle sie langsamer machen würde (genau das tut eine indizierte Ansicht), es sei denn, Ihre neue Tabelle verfügt nicht über gute Indizes.
BradC

1
Brad; Ich habe einen wirklich schlechten Blog-Beitrag darüber geschrieben, wie Ansichten mir in dieser Situation 99% meiner Leistung ersparen. Ich habe vor, ein paar andere Artikel zu schreiben, aber ich weiß, dass ich eine TONNE detaillierter darauf eingehen muss. Stört es Sie, sich das anzuschauen und mir zu sagen, was Sie von meiner Beschreibung halten? Ich weiß, dass es keinen Sinn mehr ergibt (bis ich 2-3 andere Artikel habe) .. aber ich bin total verliebt in Ansichten und das schon lange! accessadp.com/2013/01/22/do-views-increase-performance
Aaron Kempf

14

Zumindest in SQL Server werden Abfragepläne im Plan-Cache sowohl für Ansichten als auch für normale SQL-Abfragen basierend auf Abfrage- / Ansichtsparametern 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 übermittelte Abfrage benötigt wird. Wenn dieselbe Abfrage ausgegeben wird, wird sie erneut kompiliert und der Plan wird wieder in den Cache gestellt. Nein, es gibt keinen Unterschied, da Sie dieselbe SQL-Abfrage und dieselbe Ansicht mit derselben Häufigkeit wiederverwenden.

Offensichtlich wird eine Ansicht im Allgemeinen von Natur aus (dass jemand dachte, sie sollte oft genug verwendet, um daraus eine Ansicht zu machen) im Allgemeinen eher "wiederverwendet" als jede beliebige SQL-Anweisung.


14

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

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

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


1
Ein weiterer Grund für Ansichten ist die Unterstützung der Zugriffskontrolle in rollenbasierten Modellen
Annakata

1
Sie liegen falsch in Bezug auf die Leistungsverbesserungen. Ich habe in meinem ursprünglichen Kommentar nicht genug erklärt, um einige Leute zu überzeugen, aber MS verfügt über eine explizite Dokumentation zur Verwendung von Ansichten zur Verbesserung der Leistung. Siehe meine (jetzt stark herabgestimmte) Antwort unten.
Mark Brittingham

7

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


Die Schemabindung hat wenig mit der Leistung zu tun. Sie bindet das Schema der Ansicht an die zugrunde liegende Tabelle, sodass es synchron bleibt und eine Voraussetzung für indizierte Ansichten ist.
Sam Saffron

5

Nach meinem Verständnis wäre eine Ansicht vor einiger Zeit schneller, da SQL Server einen Ausführungsplan speichern und ihn dann einfach verwenden könnte, anstatt zu versuchen, einen im laufenden Betrieb herauszufinden. Ich denke, die Leistungssteigerungen sind heutzutage wahrscheinlich nicht mehr so ​​groß wie früher, aber ich müsste raten, dass es eine geringfügige Verbesserung geben würde, um die Ansicht zu verwenden.


Dies war mein Verständnis: Früher wichtig, nicht mehr
Annakata

Nicht unter Leistungsgesichtspunkten - dient als Mittel zur Zugriffsbeschränkung. Aber das wäre ein anderes Thema. ;)
AnonJr

Oh sicher, viele gute Gründe, Ansichten zu verwenden, nicht ein einziger, um rohe Abfragen zu verwenden: P
Annakata

4

Auf jeden Fall ist eine Ansicht besser als eine verschachtelte Abfrage für SQL Server. Ohne genau zu wissen, warum es besser ist (bis ich Mark Brittinghams Beitrag gelesen habe), hatte ich einige Tests durchgeführt und bei der Verwendung einer Ansicht im Vergleich zu einer verschachtelten Abfrage fast schockierende Leistungsverbesserungen festgestellt. Nachdem jede Version der Abfrage mehrere hundert Mal hintereinander ausgeführt wurde, wurde die Ansichtsversion der Abfrage in der Hälfte der Zeit abgeschlossen. Ich würde sagen, das ist Beweis genug für mich.


Danke Jordan ... ich bin froh zu hören, dass all diese Theorie in der realen Welt funktioniert .
Mark Brittingham

Ich habe Erfahrung mit verschachtelter Ansicht (Ansicht in Ansicht) und es gab eine sehr schlechte Leistung. Wenn alle Ansichten in Unterauswahl umgeschrieben wurden, war die Leistung um ein Vielfaches schneller, sodass möglicherweise ernsthafte Tests durchgeführt werden müssen.
Muflix

2

Ich würde erwarten, dass die beiden Abfragen identisch ausgeführt werden. Eine Ansicht ist nichts anderes als eine gespeicherte Abfragedefinition. Es gibt kein Zwischenspeichern oder Speichern von Daten für eine Ansicht. Der Optimierer verwandelt Ihre erste Abfrage effektiv in Ihre zweite Abfrage, wenn Sie sie ausführen.


Wenn es sich bei der Ansicht um eine kleine Gruppe von Feldern handelt und diese Felder dann mit einem Index abgedeckt sind, ist SQL Server clever genug, um diesen abdeckenden Index bei der Erfüllung der zweiten Abfrageform zu verwenden?
AnthonyWJones

1

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

Eine Ansicht in einer beliebigen Art von Schleife führt zu einer ernsthaften Verlangsamung, da die Ansicht jedes Mal neu gefüllt wird, wenn sie in der Schleife aufgerufen wird. Gleich wie eine Abfrage. In dieser Situation ist eine temporäre Tabelle, die # oder @ verwendet, um Ihre Daten zum Durchlaufen zu halten, schneller als eine Ansicht oder eine Abfrage.

Es kommt also alles auf die Situation an.


0

Es gibt keinen praktischen Unterschied und wenn Sie BOL lesen, werden Sie feststellen, dass Ihr einfaches altes SQL SELECT * FROM X das Plan-Caching usw. ausnutzt.


0

Die Speicherung des Ausführungsplans sollte einen geringfügigen Gewinn bringen, der jedoch vernachlässigbar ist.


0

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 die Leistung verbessert wird. Im Allgemeinen sollte dies besser funktionieren als eine "einfache" Abfrage. Wenn die Abfrage jedoch wirklich sehr einfach ist, können die Vorteile vernachlässigbar sein.

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


0

Meiner Meinung nach ist die Verwendung der Ansicht etwas schneller als eine normale Abfrage. Meine gespeicherte Prozedur dauerte ungefähr 25 Minuten (Arbeiten mit anderen größeren Datensatzgruppen und mehreren Verknüpfungen) und nach Verwendung der Ansicht (nicht gruppiert) war die Leistung nur ein bisschen schneller, aber überhaupt nicht signifikant. Ich musste einige andere Techniken / Methoden zur Abfrageoptimierung verwenden, um eine dramatische Änderung vorzunehmen.


Wie wir die Abfrage schreiben / gestalten, ist sehr wichtig.
kta

Ich habe festgestellt, dass die Verwendung von CTEs, um die von einer Tabelle zurückgegebenen Daten zu begrenzen und dann alle Arbeiten /
Verknüpfungen

0

Die Auswahl aus einer Ansicht oder aus einer Tabelle ist nicht sehr sinnvoll.

Wenn die Ansicht keine unnötigen Verknüpfungen, Felder usw. enthält, können Sie natürlich den Ausführungsplan Ihrer Abfragen, Verknüpfungen und Indizes überprüfen, die zur Verbesserung der Ansichtsleistung verwendet werden.

Sie können sogar einen Index für Ansichten erstellen, um die Suchanforderungen zu beschleunigen. http://technet.microsoft.com/en-us/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, Suchvorgänge wie "...%" durchzuführen, ist dies schnell möglich

In den Asp-Foren wird auf die Antwort verwiesen: https://forums.asp.net/t/1697933.aspx?Welche+ist+ schneller, wenn+ using+SELECT+query+VIEW+or+Table +


0

Entgegen aller Erwartung sind die Ansichten unter bestimmten Umständen viel langsamer.

Ich habe dies kürzlich entdeckt, als ich Probleme mit Daten hatte, die von Oracle abgerufen wurden und in ein anderes Format massiert werden mussten. Vielleicht 20.000 Quellzeilen. Ein kleiner Tisch. Zu diesem Zweck haben wir die Oracle-Daten so unverändert wie möglich in eine Tabelle importiert und dann Ansichten zum Extrahieren von Daten verwendet. Wir hatten sekundäre Ansichten basierend auf diesen Ansichten. Vielleicht 3-4 Ansichten.

Eine der letzten Abfragen, bei denen vielleicht 200 Zeilen extrahiert wurden, würde mehr als 45 Minuten dauern! Diese Abfrage basierte auf einer Kaskade von Ansichten. Vielleicht 3-4 Level tief.

Ich könnte jede der fraglichen Ansichten nehmen, ihre SQL in eine verschachtelte Abfrage einfügen und sie in ein paar Sekunden ausführen.

Wir haben sogar festgestellt, dass wir sogar jede Ansicht in eine temporäre Tabelle schreiben und diese anstelle der Ansicht abfragen können, und dies war immer noch viel schneller als die Verwendung verschachtelter Ansichten.

Was noch seltsamer war, war, dass die Leistung in Ordnung war, bis wir eine Grenze von Quellzeilen erreichten, die in die Datenbank gezogen wurden. Die Leistung fiel innerhalb weniger Tage von einer Klippe - ein paar weitere Quellzeilen waren alles, was es brauchte.

Die Verwendung von Abfragen, die aus Ansichten stammen, die aus Ansichten abgerufen werden, ist also viel langsamer als eine verschachtelte Abfrage - was für mich keinen Sinn ergibt.


-1

Ich bin auf diesen Thread gestoßen und wollte diesen Beitrag von Brent Ozar nur als etwas teilen, das bei der Verwendung von Verfügbarkeitsgruppen berücksichtigt werden sollte.

Brent Ozar Fehlerbericht

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.