Warum wird den Leuten geraten, nicht durch Ansichten zu aktualisieren?

8

Während des Studiums wurde es uns in den Kopf geschlagen, Tabellen nicht durch Ansichten zu aktualisieren, und als ich wieder am Arbeitsplatz ankam, wurde uns gesagt, dass wir die Datenbank nicht durch Ansichten aktualisieren sollten.

Wo gibt es / Gibt es signifikante Auswirkungen auf die Leistung? Oder handelt es sich eher um einen Fall, in dem leitende Entwickler / Datenbankadministratoren Nachwuchskräften sagen, dass sie dies nicht tun sollen, weil sie mit einer falschen Verbindung unabsichtlich Chaos anrichten können.

BEARBEITEN
Ich verwende MSSQL 2000-2008 (abhängig von den Angaben des Clients)

Tim Sparg
quelle
Welches DBMS verwenden Sie?
a_horse_with_no_name
@a_horse_with_no_name Aktualisiert, um DBMS anzuzeigen. Ich hatte gehofft, dass die Antwort für alle DBMS ziemlich allgemein sein würde. War ich naiv?
Tim Sparg
Sprechen Sie über Ansichten, die von Natur aus aktualisierbar sind, oder über Ansichten, für die Sie einen INSTEAD OFAuslöser schreiben müssten ? Ich habe diesen Rat nicht besonders gehört. Übrigens, haben Sie nie einen Grund angegeben?
Martin Smith
@ TimSparg: Es hängt davon ab, wie die Ansicht aktualisierbar gemacht wird. Wenn instead ofTrigger verwendet werden, gibt es keine Mehrdeutigkeit und ich sehe keinen Grund, sie nicht zu verwenden. Aber ich bin mit SQL Server nicht so vertraut, daher kann ich die Verwendung von Ansichten ohne Trigger nicht kommentieren.
a_horse_with_no_name
@ Martin Smith Ich spreche von natürlich aktualisierbaren Ansichten. Mir wurde vage gesagt, dass es Fallstricke und Leistungsprobleme gibt. Dies wurde dann an meinem Arbeitsplatz verstärkt, wo wir fest angewiesen wurden, nicht durch Ansichten zu aktualisieren. Ich fange an zu denken, dass es nur etwas war, was die älteren Entwickler / Datenbankadministratoren sagen würden, weil sie nicht erklären wollten, dass sie beim Aktualisieren durch Ansichten vorsichtig sein sollten (IE innerer oder äußerer Join)
Tim Sparg

Antworten:

10

Damit eine Ansicht ohne Verwendung von INSTEAD OFTriggern aktualisiert werden kann "SQL Server muss in der Lage sein, Änderungen von der Ansichtsdefinition eindeutig auf eine Basistabelle zu verfolgen." .

Das Aktualisieren dieser Ansichten hat keinen Leistungsnachteil, da SQL Server nur einen Abfrageplan für die betroffene Basistabelle generiert. Ein möglicher Nachteil könnte darin bestehen, dass eine Verschleierungsebene hinzugefügt wird. Wenn Sie also Views nicht als Sicherheitsschicht verwenden, ist es klarer, nur Code zu schreiben, der die Basistabelle direkt aktualisiert.

Eine andere Möglichkeit besteht darin, dass die Ansicht eine Eins zu Viele enthält JOINund Sie die "Eins" -Seite mit einem Wert von der "Viele" -Seite aktualisieren. Es ist unbestimmt, welches Ergebnis Sie erzielen, dies gilt jedoch auch für die proprietäre UPDATE ... FROMSyntax von SQL Server . Sie müssten MERGEeine skalarkorrelierte Unterabfrage verwenden, um dieses mögliche Problem zu vermeiden.

Für Ansichten , die nicht aktualisierbar und erfordern einen sind INSTEAD OFAuslöser gibt es Auswirkungen auf die Leistung als die insertedund deletedPseudo-Tabellen müssen aus der Basistabelle erzeugt werden , um , wenn möglich , die Aktualisierung der Basistabellen direkt wahrscheinlich effizienter sein wird.

Martin Smith
quelle