452 Stimmen

Ist eine Ansicht schneller als eine einfache Abfrage?

Ist ein

select *  from myView

schneller als die Abfrage selbst, um die Ansicht zu erstellen (um die gleiche Ergebnismenge zu erhalten):

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

?

Es ist mir nicht ganz klar, ob die Ansicht eine Art Zwischenspeicherung verwendet, die sie im Vergleich zu einer einfachen Abfrage schneller macht.

830voto

Mark Brittingham Punkte 28280

, Ansichten puede einen geclusterten Index zugewiesen haben, und wenn dies der Fall ist, werden sie temporäre Ergebnisse speichern, die die daraus resultierenden Abfragen beschleunigen können.

Die Dokumentation von Microsoft macht deutlich, dass Views die Leistung verbessern kann.

Erstens: Die meisten Ansichten, die Menschen erstellen, sind einfach Views und verwenden diese Funktion nicht und unterscheiden sich daher nicht von der direkten Abfrage der Basistabellen. Einfache Views werden an Ort und Stelle expandiert und damit nicht direkt zur Leistungsverbesserung beitragen - so viel ist wahr. Allerdings, indizierte Ansichten können dramatisch die Leistung zu verbessern.

Lassen Sie mich direkt zur Dokumentation gehen:

Nachdem ein eindeutiger geclusterter Index für die Ansicht erstellt wurde, wird die Ergebnismenge der Ansicht sofort materialisiert und im physischen Speicher der Datenbank persistiert, wodurch der Overhead für die Durchführung dieser kostspieligen Operation zur Ausführungszeit eingespart 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 eines Tabellenverweises verwendet.

Nochmals, die Dokumentation:

Die indizierte Ansicht kann bei der Ausführung einer Abfrage 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 Teile der Abfrage im kostengünstigsten Abfrageplan ersetzen kann. Im zweiten Fall wird der indizierte View anstelle der zugrunde liegenden Tabellen und ihrer normalen Indizes verwendet. Der View muss in der Abfrage nicht referenziert werden, damit der Abfrageoptimierer ihn während der Abfrageausführung verwenden kann. Dadurch können bestehende Anwendungen von den neu erstellten indizierten Ansichten profitieren, ohne dass diese Anwendungen geändert werden müssen.

Diese Dokumentation sowie Diagramme, die die Leistungsverbesserungen zeigen, finden Sie unter aquí .

Update 2: Die Antwort wurde mit der Begründung kritisiert, dass es der "Index" ist, der den Performancevorteil bietet, und nicht die "Ansicht". Dies ist jedoch leicht zu widerlegen.

Nehmen wir an, wir sind ein Softwareunternehmen in einem kleinen Land; ich werde Litauen als Beispiel nehmen. Wir verkaufen weltweit Software und speichern unsere Daten in einer SQL-Server-Datenbank. Wir sind sehr erfolgreich und haben in ein paar Jahren mehr als 1.000.000 Datensätze. Oft müssen wir jedoch Verkäufe für Steuerzwecke melden, und wir 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 Datensätze, die wir benötigen, in einem indizierten Cache halten, wie in der MS-Dokumentation beschrieben. Wenn wir unsere Berichte für litauische Verkäufe im Jahr 2008 ausführen, durchsucht unsere Abfrage einen Index mit einer Tiefe von nur 7 (Log2(100) mit einigen ungenutzten Blättern). Würden wir dasselbe ohne die VIEW tun und uns nur auf einen Index in der Tabelle verlassen, müssten wir einen Indexbaum mit einer Suchtiefe von 21 durchlaufen!

Es ist klar, dass die Ansicht selbst uns einen Leistungsvorteil (3x) gegenüber der einfachen Verwendung des Index allein verschaffen würde. 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. Ich bin mir zwar ziemlich sicher, dass SQL Server eine Variante eines B-Baums verwendet, aber ich kenne die Details nicht. Nichtsdestotrotz gilt der Punkt.

Aktualisierung 3: Es ist die Frage aufgetaucht, ob eine indizierte Ansicht nur einen Index verwendet, der auf der zugrunde liegenden Tabelle platziert ist. Das heißt, um es so auszudrücken: "Eine indizierte Ansicht ist nur das Äquivalent eines Standardindexes und bietet nichts Neues oder Einzigartiges für eine Ansicht." Wenn dies wahr wäre, dann wäre die obige Analyse natürlich falsch! Lassen Sie mich ein Zitat aus der Microsoft-Dokumentation anführen, um zu verdeutlichen, warum ich diese Kritik für unberechtigt und 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 erreicht werden können.

Zusammen mit dem obigen Zitat über die Persistenz von Daten im physischen Speicher und anderen Informationen in der Dokumentation darüber, wie Indizes auf Ansichten erstellt werden, denke ich, dass es sicher ist zu sagen, dass eine indizierte Ansicht ist no nur ein zwischengespeicherter SQL Select, der zufällig einen in der Haupttabelle definierten Index verwendet. Daher bleibe ich bei dieser Antwort.

63voto

BradC Punkte 38356

Im Allgemeinen nicht. Ansichten dienen in erster Linie der Bequemlichkeit und Sicherheit und bringen (für sich genommen) keinen Geschwindigkeitsvorteil.

Allerdings verfügen SQL Server 2000 und höher über eine Funktion namens Indizierte Ansichten dass puede die Leistung erheblich verbessern, allerdings mit einigen Vorbehalten:

  1. Nicht jede Ansicht kann zu einer indizierten Ansicht gemacht werden; sie müssen einer spezifischer Satz von Leitlinien , was (neben anderen Einschränkungen) bedeutet, dass Sie keine üblichen Abfrageelemente wie COUNT , MIN , MAX , oder TOP .
  2. Indizierte Ansichten verwenden physischen Speicherplatz in der Datenbank, genau wie Indizes in einer Tabelle.

Dieser Artikel beschreibt zusätzliche Vorteile und Grenzen der indizierten Ansichten :

Sie können

  • Die View-Definition kann auf eine oder mehrere Tabellen in der derselben Datenbank verweisen.
  • Sobald der eindeutige geclusterte Index erstellt ist, können zusätzliche nicht geclusterte Indizes gegen die Ansicht erstellt werden.
  • Sie können die Daten in den zugrundeliegenden Tabellen aktualisieren - einschließlich Einfügungen, Aktualisierungen, Löschungen und sogar Abbrüche.

Du kannst nicht

  • Die View-Definition kann nicht auf andere Views oder Tabellen verweisen in anderen Datenbanken verweisen.
  • Sie kann 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. Der View wird mit der Option WITH SCHEMABINDING erstellt.
  • Sie können nicht immer vorhersagen, was der Abfrageoptimierer tun wird. Wenn Sie die Enterprise Edition verwenden, wird er automatisch den eindeutigen clustered index als Option für eine Abfrage - aber wenn er einen "besseren" Index findet Index findet, wird dieser verwendet. Sie können den Optimierer zwingen, den Index durch den WITH NOEXPAND-Hinweis zu verwenden - aber seien Sie vorsichtig, wenn Sie einen Hinweises.

16voto

Ryan Guill Punkte 13188

EDIT: Ich habe mich geirrt, und Sie sollten sehen Markiert die obige Antwort.

Ich kann nicht aus Erfahrung sprechen mit SQL-Server für die meisten Datenbanken lautet die Antwort jedoch nein. Der einzige potenzielle Leistungsvorteil, der sich aus der Verwendung einer Ansicht ergibt, besteht darin, dass sie möglicherweise einige Zugriffspfade auf der Grundlage der Abfrage erstellt. Der Hauptgrund für die Verwendung eines Views ist jedoch die Vereinfachung einer Abfrage oder die Standardisierung des Zugriffs auf bestimmte Daten in einer Tabelle. Im Allgemeinen werden Sie keinen Leistungsvorteil erhalten. Ich kann mich aber auch irren.

Ich würde mir ein etwas komplizierteres Beispiel ausdenken und die Zeit selbst bestimmen, um es zu sehen.

14voto

Charles Bretana Punkte 137391

Zumindest in SQL Server werden Abfragepläne sowohl für Ansichten als auch für normale SQL-Abfragen auf der Grundlage von Abfrage-/View-Parametern im Plan-Cache gespeichert. Bei beiden werden sie aus dem Cache gelöscht, wenn sie lange genug nicht verwendet wurden und der Platz für eine andere, neu eingereichte Abfrage benötigt wird. Wenn dann dieselbe Abfrage erneut gestellt wird, wird sie neu kompiliert und der Plan wird wieder in den Cache gestellt. Es besteht also kein Unterschied, wenn Sie dieselbe SQL-Abfrage und dieselbe Ansicht mit derselben Häufigkeit wiederverwenden.

Offensichtlich ist es im Allgemeinen wahrscheinlicher, dass eine Ansicht wiederverwendet wird als eine beliebige SQL-Anweisung, da sie von Natur aus so oft verwendet wird, dass man sie zu einer Ansicht macht.

8voto

Ein View ist für SQL Server auf jeden Fall besser als eine verschachtelte Abfrage. Ohne genau zu wissen, warum es besser ist (bis ich Mark Brittinghams Beitrag las), hatte ich einige Tests durchgeführt und fast schockierende Leistungsverbesserungen bei der Verwendung eines Views gegenüber einer verschachtelten Abfrage festgestellt. Nachdem ich jede Version der Abfrage mehrere hundert Mal hintereinander ausgeführt hatte, war die View-Version der Abfrage in der Hälfte der Zeit fertig. Ich würde sagen, das ist für mich Beweis genug.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X