Ist verschachtelte Ansicht ein gutes Datenbankdesign?

42

Ich habe vor langer Zeit irgendwo gelesen. Das Buch besagt, dass wir eine verschachtelte Ansicht in SQL Server nicht zulassen sollten. Ich bin mir nicht sicher, warum wir das nicht können, oder ich kann mich an eine falsche Aussage erinnern.

Studenten

SELECT studentID, first_name, last_name, SchoolID, ... FROM students

CREATE VIEW vw_eligible_student
AS 
SELECT * FROM students
WHERE enroll_this_year = 1

Lehrer

SELECT TeacherID, first_name, last_name, SchoolID, ... FROM teachers

CREATE VIEW vw_eligible_teacher
AS 
SELECT * FROM teachers
WHERE HasCert = 1 AND enroll_this_year = 1

Schulen

CREATE VIEW vw_eligible_school
AS 
SELECT TOP 100 PERCENT SchoolID, school_name 

FROM schools sh 
JOIN
     vw_eligible_student s 
     ON s.SchoolID = sh.SchoolID
JOIN 
     vw_eligible_teacher t
     ON s.SchoolID = t.SchoolID

An meinem Arbeitsplatz habe ich eine unserer internen Datenbankanwendungen untersucht. Ich habe bei den gefundenen Objekten herausgefunden, dass sich zwei oder drei Schichten des Ansichtsstapels befinden. Das hat mich an das erinnert, was ich in der Vergangenheit gelesen habe. Kann jemand helfen, es zu erklären?

Wenn dies nicht in Ordnung ist, möchte ich wissen, dass es sich nur um SQL Server oder allgemein um das Datenbankdesign handelt.

Zusätzliche Informationen: Ich habe ein Beispiel aus meiner Firma aktualisiert. Ich ändere ein bisschen, um allgemeiner zu sein, ohne zu viele technische (zu viele Spalten in diesem Beispiel). Meist basiert die verschachtelte Ansicht, die wir verwendet haben, auf einer abstrakten oder aggregierten Ansicht. Zum Beispiel haben wir eine große Schülertabelle mit Hunderten von Spalten. Sprich, Eligible Student Viewbasiert auf Schülern, die sich in diesem Jahr einschreiben. Die schülerfähige Ansicht kann auch an anderen Stellen verwendet werden, z. B. in einer gespeicherten Prozedur.

Richard Sayakanit
quelle
3
Ich würde behaupten, dass die gleichen Vor- und Nachteile unabhängig von der spezifischen Plattform in etwa gleich sind.
Aaron Bertrand

Antworten:

47

Unabhängig von der Plattform gelten die folgenden Hinweise.

(-) Verschachtelte Ansichten:

  • sind schwerer zu verstehen und zu debuggen

    zB Auf welche Tabellenspalte bezieht sich diese Ansichtsspalte? Lassen Sie sich durch 4 Ebenen der Ansichtsdefinitionen graben ...

  • erschweren Sie es dem Abfrageoptimierer, den effizientesten Abfrageplan zu erstellen

    Sehen Sie dies , dies , dies und das für anekdotische Beweise. Vergleichen Sie dies , was zeigt, dass das Optimierungsprogramm häufig intelligent genug ist, um verschachtelte Ansichten korrekt zu entpacken und einen optimalen Plan auszuwählen, jedoch nicht ohne Kompilierungskosten.

    Sie können die Leistungskosten messen, indem Sie die Sichtabfrage mit einer entsprechenden Abfrage vergleichen, die für die Basistabellen geschrieben wurde.

(+) In verschachtelten Ansichten können Sie dagegen:

  • Aggregationen oder Geschäftsregeln zentralisieren und wiederverwenden
  • abstrahieren Sie Ihre zugrunde liegende Struktur (sagen wir von anderen Datenbankentwicklern)

Ich habe festgestellt, dass sie selten notwendig sind.


In Ihrem Beispiel verwenden Sie verschachtelte Ansichten, um bestimmte Geschäftsdefinitionen zu zentralisieren und wiederzuverwenden (z. B. "Was ist ein berechtigter Student?"). Dies ist eine gültige Verwendung für verschachtelte Ansichten. Wenn Sie diese Datenbank verwalten oder optimieren, müssen Sie die Kosten für deren Aufbewahrung mit den Kosten für deren Entfernung abwägen.

  • Behalten: Durch Behalten der verschachtelten Ansichten entstehen die oben aufgeführten Vor- und Nachteile.

  • Entfernen: So entfernen Sie die verschachtelten Ansichten:

    1. Sie müssen alle Vorkommen der Ansichten durch ihre Basisabfragen ersetzen.

    2. Sie müssen daran denken, alle relevanten Abfragen zu aktualisieren, wenn sich Ihre Definition des berechtigten Schülers / Lehrers / der Schule ändert, anstatt nur die Definition der relevanten Ansicht zu aktualisieren.

Nick Chammas
quelle
1
+1, außer ich würde "härter" für das Abfrageoptimierungsprogramm durch "fast unmöglich" ersetzen. :)
Jason
1
@Jason - Ich stimme zu und wünschte, ich könnte auf einige konkrete Beispiele verweisen. Kennen Sie Referenzen, die erklären oder demonstrieren, warum dies so ist?
Nick Chammas
1
Alles, was ich finden kann, ist ein anekdotischer Beweis dafür, dass verschachtelte Ansichten im Vergleich zu "abgeflachtem" SQL unter Leistungsproblemen leiden, wenn sie verwendet werden. sqlservercentral.com/blogs/2cents/archive/2010/04/05/… Das Problem scheint auf die Tatsache zurückzuführen zu sein, dass die Datenbank (in diesem Fall SQL Server) bestimmte Filter nicht anwendet, bevor sie Tabellen verknüpft machen die Abfrage länger als es sollte.
Jason
7
In Bezug auf das Problem mit dem Abfrageoptimierer bin ich anderer Meinung, da die resultierende Abfrage nach dem Auflösen aller Ansichten dieselbe ist, unabhängig davon, wie viele Ansichtstransformationen sie durchlaufen hat (mit Ausnahme einiger zusätzlicher Spalten in Zwischenergebnismengen, die vom Optimierer problemlos entfernt werden können). Dies lässt das Debuggen zu; IMO macht es das Debuggen einfacher, verschachtelte Ansichten zu haben, da ich mir Zwischenergebnisse ansehen kann, um zu sehen, wo es schief gelaufen ist.
Simon Richter
1
Ich habe einen eingebetteten Datenbankserver geschrieben, und für mich war es naheliegend, zuerst die Ansichten aufzulösen und dann die resultierende Abfrage zu optimieren, da es eigentlich ziemlich unwahrscheinlich ist, dass alle Abfragen in Ansichten alle Spalten zurückgeben. Ich kann mir nicht einmal einen Grund vorstellen, warum das Realisieren von Ansichtsdaten mitten in einer Abfrage etwas bringt, was für mich ein Kinderspiel war.
Simon Richter
26

Manchmal werden verschachtelte Ansichten verwendet, um zu verhindern, dass sich Aggregate wiederholen. Angenommen, Sie haben eine Ansicht, die Nachrichten zählt und nach Benutzer-ID gruppiert. Möglicherweise haben Sie eine Ansicht, die die Anzahl der Benutzer mit> 100 Nachrichten zählt. Dies ist am effektivsten, wenn es sich bei der Basisansicht um eine indizierte Ansicht handelt. Sie müssen nicht unbedingt eine weitere indizierte Ansicht erstellen, um die Daten mit einer etwas anderen Gruppierung darzustellen, da Sie jetzt zweimal für die Indexpflege zahlen, wenn die Leistung wahrscheinlich ist ausreichend gegen die ursprüngliche Ansicht.

Wenn dies alles nur verschachtelte Ansichten sind, in denen Sie select * ausführen, aber die Reihenfolge oder top ändern, ist dies anscheinend besser als gespeicherte Prozedur mit Parametern (oder Inline-Funktionen mit Tabellenwerten) gekapselt als eine Reihe verschachtelter Ansichten. MEINER BESCHEIDENEN MEINUNG NACH.

Aaron Bertrand
quelle
4
"Dies ist am effektivsten, wenn die Basisansicht eine indizierte Ansicht ist." Wichtiger Punkt.
Nick Chammas
7

Spätere Versionen von SQL (2005+) scheinen die Verwendung von Ansichten besser zu optimieren. Ansichten eignen sich am besten zur Konsolidierung von Geschäftsregeln. EG: Wo ich arbeite, haben wir eine Telekommunikationsproduktdatenbank. Jedes Produkt ist einem Tarifplan zugeordnet, und dieser Tarifplan kann ausgetauscht werden, und die Tarife im Tarifplan können aktiviert / deaktiviert werden, wenn die Tarife erhöht oder geändert werden.

Um dies zu vereinfachen, können wir verschachtelte Ansichten erstellen. Die erste Ansicht fügt die Tarifpläne einfach mit den benötigten Tabellen zu ihren Tarifen hinzu und gibt alle erforderlichen Daten zurück, die für die nächsten Ansichtsebenen erforderlich sind. 2. Ansicht (en) können nur aktive Tarifpläne und deren aktive Tarife isolieren. Oder nur Kundentarife. Oder Mitarbeiterpreise (für Mitarbeiterrabatt). Oder Preise für Geschäfts- oder Privatkunden. (Tarifpläne können kompliziert werden). Entscheidend ist, dass die Basisansicht sicherstellt, dass unsere gesamte Geschäftslogik für Tarifpläne und Tarife ordnungsgemäß an einem Ort zusammengeführt werden. In der nächsten Ansichtsebene konzentrieren wir uns mehr auf bestimmte Tarifpläne (Typen, Aktiv / Inaktiv usw.).

Ich bin damit einverstanden, dass das Debuggen von Ansichten problematisch werden kann, wenn Sie gleichzeitig Abfragen und Ansichten erstellen. Wenn Sie jedoch eine bewährte Ansicht verwenden, erleichtert dies das Debuggen. Sie wissen, dass die Anzeige bereits den Rufton durchlaufen hat, sodass Sie wissen, dass das Problem höchstwahrscheinlich nicht durch den Rufton verursacht wird.

Es können jedoch Probleme mit Ihren Ansichten auftreten. "Was ist, wenn ein Produkt nur einem inaktiven Tarif zugeordnet ist?" oder "Was ist, wenn ein Tarif nur inaktive Tarife enthält?" Nun, das kann auf der Front-End-Ebene mit Logik abgefangen werden, die Benutzerfehler abfängt. "Fehler, Produkt befindet sich in einem inaktiven Tarifplan ... bitte korrigieren". Wir können auch Abfrageprüfungen durchführen, um dies vor einem Abrechnungslauf zu überprüfen. (Alle Pläne auswählen und zur aktiven Tarifplanansicht wechseln, nur Tarife zurückgeben, die keinen aktiven Tarifplan erhalten, da Probleme behoben werden müssen).

Das Gute daran ist, dass Sie mit den Ansichten Abfragen für Berichte, Abrechnungen usw. erheblich reduzieren können. Sie können eine Kundenkontoansicht und dann eine Ansicht auf der zweiten Ebene nur aktiver Kunden erstellen. Team das mit Blick auf die Kundenadresse. Team das mit Blick auf Produkt (e) (beigetreten auf welches Produkt (e) der Kunde hat). Team das, um Produkt (e) Rateplan anzuzeigen. Team das mit Blick auf Produkteigenschaften. Anzeigen, Anzeigen, Anzeigen, jeder Versuch ist fehlerfrei, um die Integrität sicherzustellen. Ihre Endabfrage unter Verwendung der Ansichten ist sehr kompakt.

bearbeiten:

Als Beispiel dafür, dass die Ansicht besser gewesen wäre als nur eine flache Abfrage von Tabellen. Wir haben einen Zeitarbeiter hinzugezogen, um einige Änderungen vorzunehmen. Sie sagten ihm, es gäbe Ansichten für Dinge, aber er beschloss, alle seine Fragen zu verflachen. Bei der Abrechnung wurden einige seiner Fragen beantwortet. Sie bekamen immer wieder verschiedene Tarife und Tarife für Dinge. Es stellte sich heraus, dass bei seinen Abfragen Kriterien fehlten, die eine Abrechnung der Tarife nur dann zuließen, wenn sie zwischen dem Start- und Enddatum lagen, an dem der Tarifplan diese / jene Tarife verwenden sollte. Hoppla. Wenn er die Ansicht benutzt hätte, hätte sie diese Logik bereits berücksichtigt.

Grundsätzlich muss man Leistung gegen Vernunft abwägen. Vielleicht können Sie allerhand ausgefallene Dinge tun, um die Leistung einer Datenbank zu steigern. Aber wenn es bedeutet, dass es ein Albtraum für eine neue Person ist, die es übernimmt / unterhält, ist es das wirklich wert? Lohnt es sich wirklich, wenn der neue Typ Schlag auf Schlag spielen muss, um all die Fragen zu finden, die erforderlich sind, um seine Logik zu ändern (und das Risiko einzugehen, dass er sie vergisst / dickfingert)? Haben Sie nicht eine Kerngeschäftslogik zu einer konsolidiert, die in Hunderten von anderen Abfragen verwendet werden kann? Es liegt wirklich an Ihrem Unternehmen und Ihrem IT / IS / DB-Team. Aber ich würde Klarheit und Konsolidierung aus einer Hand der Leistung vorziehen.

bla bla
quelle
4

Das eigentliche Problem sind nicht in sich verschachtelte Ansichten. Das eigentliche Problem ist die Verbreitung verschachtelter Ansichten, da Entwickler zusätzliche Optimierungen an vorhandenen Ansichten vornehmen. Ich habe Abfragen mit einer verschachtelten Ansicht 4 Ebenen gefunden, die tatsächlich mit einer der Ansichten in ihrer Definition verbunden sind. Unsere Tendenz, einen einfachen Ausweg zu finden, anstatt ein Problem zu analysieren und zu lösen, ist die Wurzel des Problems.

Strahl
quelle
0

In meiner Umgebung replizieren wir viele Tabellen vom Produktionsserver auf den Berichtsserver. Auf dem Berichtsserver gibt es zahlreiche Ansichten, die auf replizierten Produktionstabellen basieren UND verschachtelt sind. Bevor die Replikation beginnt, müssen alle Ansichten entfernt werden, um die Replikation zu ermöglichen (wir verwenden drop und create, da sich die Tabellenstruktur in der Produktion häufig ändert). Nach Beendigung der Replikation müssen alle Ansichten neu erstellt werden.

Hier ist der unterhaltsame Teil: Da viele der Ansichten verschachtelt sind, müssen sie in einer bestimmten Reihenfolge neu erstellt werden. Während Sie Änderungen an der Definition der Ansichten vornehmen, müssen Sie darauf achten, dass die korrekte Reihenfolge für die Neuerstellung eingehalten wird. Es ist ein totales Durcheinander. Ich rate dringend davon ab, verschachtelte Ansichten zu verwenden, wenn Sie die Replikation verwenden oder einfach Ihre Tabellen löschen und neu erstellen, die als Quelle für Ansichten dienen.

Leistung ist eine andere Sache. Ansichten, die auf anderen Ansichten basieren, sind nichts anderes als mehrere auszuführende Abfragen. Es ist einfacher, die größere Abfrage zusammenzustellen, einen Job zu erstellen und daraus eine Tabelle zu erstellen. Einfacher und verbessert die Leistung.

Narwal
quelle