Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ist eine Ansicht schneller als eine einfache Abfrage?

Ja , Aufrufe können haben einen Clustered-Index zugewiesen, und wenn sie dies tun, speichern sie temporäre Ergebnisse, die resultierende Abfragen beschleunigen können.

Microsofts eigene Dokumentation macht sehr deutlich, dass Ansichten die Leistung verbessern können.

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

Lassen Sie mich direkt zur Dokumentation gehen:

Nachdem ein eindeutiger gruppierter 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 Durchführung dieser kostspieligen Operation zur Ausführungszeit eingespart 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.

Nochmal die Dokumentation:

Die indizierte Ansicht 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 Abfragen im kostengünstigsten Abfrageplan ersetzen kann. Im zweiten Fall wird die indizierte Ansicht anstelle der zugrunde liegenden Tabellen und ihrer gewöhnlichen Indizes verwendet. Auf die Ansicht muss in der Abfrage nicht verwiesen werden, damit der Abfrageoptimierer sie während der Abfrageausführung verwenden kann. Dadurch können vorhandene Anwendungen von den neu erstellten indizierten Ansichten profitieren, ohne diese Anwendungen zu ändern.

Diese Dokumentation sowie Diagramme, die Leistungsverbesserungen demonstrieren, finden Sie hier.

Aktualisierung 2: Die Antwort wurde mit der Begründung kritisiert, dass es der "Index" ist, der den Leistungsvorteil bietet, 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 verwenden. Wir verkaufen Software weltweit und führen 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 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 aufbewahren, 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 unbenutzten 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 reales Beispiel zu verwenden, aber Sie werden feststellen, dass uns eine einfache Liste litauischer Verkäufe 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. Nichtsdestotrotz gilt der Punkt.

Aktualisierung 3: Es ist die Frage aufgekommen, ob eine indizierte Ansicht nur einen Index verwendet, der auf der zugrunde liegenden Tabelle platziert ist. Um es anders auszudrücken:"Eine indizierte Ansicht ist nur das Äquivalent zu einem Standardindex und bietet nichts Neues oder Einzigartiges für eine Ansicht." Wenn dem so wäre, dann wäre die obige Analyse natürlich falsch! Lassen Sie mich ein Zitat aus der Microsoft-Dokumentation geben, das zeigt, warum ich denke, dass diese Kritik nicht gültig oder wahr ist:

Die Verwendung von Indizes zur Verbesserung der Abfrageleistung ist kein neues Konzept. Allerdings bieten indizierte Ansichten 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 für Ansichten erstellt werden, kann ich mit Sicherheit sagen, dass eine indizierte Ansicht nicht ist nur eine zwischengespeicherte SQL-Auswahl, die zufällig einen Index verwendet, der in der Haupttabelle definiert ist. Daher bleibe ich weiterhin bei dieser Antwort.