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?
Antworten
Zu viele Anzeigen?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.
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.
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.
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.
- See previous answers
- Weitere Antworten anzeigen