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.
sql
sql-server
performance
JohnIdol
quelle
quelle
Antworten:
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:
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:
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:
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.
quelle
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 :
COUNT
,MIN
,MAX
, oderTOP
.Dieser Artikel beschreibt zusätzliche Vorteile und Einschränkungen indizierter Ansichten :
quelle
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.
quelle
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.
quelle
Es kann schneller sein, wenn Sie eine materialisierte Ansicht erstellen ( mit Schemabindung ). Nicht materialisierte Ansichten werden genau wie die reguläre Abfrage ausgeführt.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Die Speicherung des Ausführungsplans sollte einen geringfügigen Gewinn bringen, der jedoch vernachlässigbar ist.
quelle
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.
quelle
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.
quelle
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 +
quelle
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.
quelle
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
quelle