11 Stimmen

Abfrage vs. Ansicht

Ich möchte wissen, was der Unterschied zwischen einer Abfrage und einer Ansicht in Bezug auf die Leistung ist. Und wenn eine Ansicht kostspielig ist, was könnte ich außer einer Abfrage noch tun, um die Leistung zu verbessern?

5voto

HLGEM Punkte 91543

Ich kann nicht für alle Datenbanken sprechen, aber in SQL Server können Sie Ansichten nicht indizieren, es sei denn, Sie haben eine Enterprise-Version. Eine nicht indizierte Ansicht kann wesentlich leistungsschwächer sein als eine Abfrage, vor allem, wenn Sie eine Abfrage für sie schreiben, um einige Where-Bedingungen hinzuzufügen. Indizierte Ansichten können im Allgemeinen eine recht gute Leistung erbringen. Eine indizierte Ansicht kann sich auch auf mehrere Felder beziehen, die sich in verschiedenen Tabellen befinden, und das kann die Leistung gegenüber einer Ad-hoc-Abfrage verbessern. (Möglicherweise aber auch nicht, denn bei der Leistungsoptimierung müssen Sie immer auf Ihre speziellen Umstände testen.)

Ein Argument gegen Ansichten ist, dass sie keine Auswahl von Wo-Kriterien während der Laufzeit ermöglichen. Daher haben Sie oft sowohl eine Ansicht als auch eine Abfrage.

Ansichten lassen sich leichter pflegen (fügen Sie die neue Tabelle einfach in eine Verknüpfung ein, und alle, die auf Finanzberichte zugreifen, haben sie zur Verfügung), aber sie sind viel schwieriger in der Leistungsoptimierung. Das liegt zum Teil daran, dass sie dazu neigen, übermäßig verallgemeinert zu werden, und daher langsamer sind als ihre Gegenstücke, die nur das Nötigste zurückgeben. Und ja, wie Jonathan schon sagte, kann man viel zu leicht dazu kommen, Ansichten für einen Bericht zu einem Durcheinander zusammenzufügen, das viel öfter als nötig mit denselben großen Tabellen verknüpft wird und sehr langsam ist.

Zwei Orte, an denen die Ansichten jedoch glänzen, sind: Sie stellen sicher, dass komplexe Zusammenhänge immer korrekt beschrieben werden. Dies ist einer der Gründe, warum sie von Berichtsverfassern bevorzugt werden. Begrenzung des Zugriffs auf eine Teilmenge von Datensätzen

Es gibt auch Beschränkungen für die Art der Abfragen, die für eine Ansicht durchgeführt werden können, wenn es sich um eine Ad-hoc-Abfrage oder einen gespeicherten Prozess handelt. So können Sie beispielsweise keine if-Anweisung (oder anderen prozeduralen Code wie Schleifen) verwenden oder, wie oben erwähnt, keine Laufzeitwerte für die where-Kriterien angeben.

Eine Stelle, an der Ansichten oft deutlich langsamer sind, ist der Aufruf anderer Ansichten. Die zugrundeliegenden Ansichten müssen in einigen Datenbanken vollständig realisiert werden, so dass Sie möglicherweise 4.459.203 Datensätze aufrufen müssen, um die 10 zu sehen, an denen Sie letztendlich interessiert sind. Wenn Sie dies mehr als einmal tun, kann es sehr schnell sehr langsam werden; Ansichten, die Ansichten aufrufen, sind einfach eine schlechte Praxis.

3voto

Dave Markle Punkte 91733

Ansichten und Ad-hoc-Abfragen sind im einfachen Fall in Bezug auf die Leistung nahezu identisch. Wenn Sie mit einer Ansicht programmieren, sollten Sie sich das so vorstellen, als ob der Text der Ansichtsdefinition ausgeschnitten und in die übergeordnete Abfrage eingefügt würde.

HLGEM weist in seiner Antwort darauf hin, dass bestimmte Editionen von SQL Server die Möglichkeit bieten, Ansichten zu "indizieren". In diesem Fall verwaltet SQL Server hinter den Kulissen dieselben Strukturen, die einer Tabelle zugrunde liegen, so dass eine indizierte Ansicht und eine Tabelle in Bezug auf die Leistung sehr ähnlich sind.

In SQL Server können Sie zwar im Allgemeinen Ansichten relativ großzügig verschachteln, ohne dass es zu Leistungsproblemen kommt, aber es kann das Verständnis und die Fehlersuche erschweren.

2voto

Daniel M Punkte 1507

Wenn sie genau dasselbe tun, kann ein View bei der ersten Ausführung etwas schneller sein, da der Datenbankserver einen vorkompilierten Ausführungsplan für ihn hat. Das hängt allerdings von Ihrem Server ab.

Betonung auf Macht und etwas...

2voto

Scott Punkte 590

In SQL Server glaube ich, dass der Leistungsunterschied zwischen Views und Abfragen vernachlässigbar ist. Um die Leistung zu verbessern, würde ich empfehlen, eine weitere Tabelle zu erstellen, die die Ergebnisse der Ansicht enthält. Sie könnten vielleicht eine Staging-Tabelle erstellen, in der neue Daten gespeichert werden, und dann kann eine gespeicherte Prozedur in einem bestimmten Intervall ausgeführt werden, die die Arbeitstabelle mit den neuen Informationen auffüllt. Ein Trigger könnte für diesen Zweck geeignet sein. Je nach den Anforderungen Ihrer Anwendung kann dieses Design geeignet sein oder auch nicht. Wenn Sie mit Daten arbeiten, die nahezu in Echtzeit vorliegen, führt dieser Ansatz zu Gleichzeitigkeitsproblemen...

Außerdem sollten Sie sicherstellen, dass die Basistabellen, die Sie zur Erstellung Ihrer Ansicht verwenden, korrekt indiziert sind und dass die Abfrage selbst optimiert ist. Schließlich glaube ich, dass es in SQL Server Enterprise möglich ist, indizierte Ansichten zu erstellen, obwohl ich sie noch nie verwendet habe.

1voto

Jack Ryan Punkte 8258

Ansichten fördern die Wiederverwendung von Code und können die Komplexität der Datenbank abstrahieren, um ein kohärenteres "Geschäftsmodell" der Daten zu erstellen. Allerdings sind sie nicht annähernd so anpassungsfähig. Viele DBAs, mit denen ich zusammengearbeitet habe, mögen es nicht, wenn diese auf Views angewendet werden, da sie dann in vielen Abfragen wiederverwendet werden können. Ich selbst verwende gerne Views.

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