Verwenden Sie SQL-Ansicht oder SQL-Abfrage?

8

Ich arbeite an einer Anwendung, um Daten von einem MS-SQL-Server (2005) zu erhalten. Im Befehlstext kann ich eine SQL-Abfrage wie folgt übergeben:

%Vor%

Ich könnte die Abfrage auch als Sicht auf meinen SQL-Server setzen:

%Vor%

Dann kann ich die Ansicht in einer vereinfachten Abfrage wie folgt verwenden:

%Vor%

Ich bin nicht sicher, welcher Weg besser ist. Wird die Ansicht schneller als eine SQL-Abfrage sein? Übrigens ist die Abfrage, die ich hier zeige, eine vereinfachte. Die eigentliche Abfrage SELECT ist komplizierter.

    
David.Chu.ca 17.06.2009, 03:32
quelle

9 Antworten

16

Ich würde eine Sicht aus verschiedenen Gründen erstellen

A) Eine gut konstruierte Ansicht tendiert dazu, schneller zu laufen als eine Abfrage, obwohl Sie bei der Abfrageoptimierung möglicherweise keinen großen Unterschied bemerken.

B) Es behält die Kenntnis der Datenbankstruktur in der Datenbank selbst bei - eine gute Abstraktionsebene hinzufügend (als eine Randnotiz, die Verwendung einer gespeicherten Prozedur anstelle einer Inline-Abfrage in Erwägung ziehen - dies hält Datenbankwissen in der Datenbank selbst)

C) Wenn Sie eine strukturelle Änderung an der Datenbank vornehmen müssen, können Sie die Ansicht konsistent halten, ohne Ihren Code neu erstellen zu müssen.

ÄNDERUNG Ich werde diese Antwort im Lichte einiger Kommentare ändern, um einige Punkte zu klären ...

Es ist absolut richtig, dass eine Standardansicht keinen wirklichen Leistungsgewinn gegenüber einer Abfrage bietet. Eine Standardansicht wird zur Laufzeit materialisiert, was sie im Wesentlichen nicht anders als eine bequeme Möglichkeit zum Ausführen einer Abfrage der gleichen Struktur unterscheidet. Eine Indexansicht wird jedoch sofort materialisiert und die Ergebnisse werden im physischen Speicher beibehalten. Wie bei jeder Entwurfsentscheidung sollte die Verwendung einer indizierten Sicht sorgfältig geprüft werden. Es gibt kein freies Mittagessen; Die Strafe, die Sie für die Verwendung von indizierten Sichten zahlen, kommt in Form von zusätzlichen Speicheranforderungen und Overhead, die mit der Wartung der Ansicht verbunden sind, wenn Änderungen an der zugrunde liegenden Datenbank vorgenommen werden. Diese werden am besten in Fällen verwendet, in denen Daten aus mehreren Tabellen häufig zusammengefügt und aggregiert werden, und in Fällen, in denen auf Daten viel häufiger zugegriffen wird als auf Änderungen.

Ich stimme auch Kommentaren zu strukturellen Änderungen zu - das Hinzufügen neuer Spalten hat keinen Einfluss auf die Ansicht. Wenn jedoch Daten verschoben, normalisiert, archiviert usw. werden, kann dies ein guter Weg sein, solche Änderungen von der Anwendung zu isolieren. Diese Situationen sind selten und die gleichen Ergebnisse können durch die Verwendung von gespeicherten Prozeduren anstelle einer Ansicht erzielt werden.

    
James Conigliaro 17.06.2009, 03:38
quelle
3

Im Allgemeinen habe ich herausgefunden, dass es am besten ist, Ansichten aus verschiedenen Gründen zu verwenden:

  • Komplexe Abfragen können im Code schwer lesbar werden
  • Sie können die Ansicht ändern, ohne
  • erneut zu kompilieren
  • Im Zusammenhang damit können Sie Änderungen in der zugrunde liegenden Datenbankstruktur in der Ansicht behandeln, ohne dass Code berührt wird, solange dieselben Felder zurückgegeben werden

Es gibt wahrscheinlich mehr Gründe, aber an dieser Stelle würde ich niemals eine Abfrage direkt im Code schreiben.

Sie sollten auch in eine Art von ORM (Object Relational Mapper) -Technologie wie LINQ to SQL (L2S) schauen. Sie können SQL-ähnliche Abfragen in Ihrem Code verwenden, aber alles wird durch Objekte abstrahiert, die im L2S-Designer erstellt wurden.

(Eigentlich verschiebe ich gerade unsere aktuellen L2S-Objekte, um von den Ansichten wegzulaufen. Es ist ein bisschen komplizierter, weil die Beziehungen nicht so gut durchkommen ... aber es erlaubt mir, eine Menge von Objekten zu erstellen, die über 2 Datenbanken laufen lassen und alles schön abstrahiert halten, also kann ich die zugrundeliegenden Tabellennamen ändern, um Namenskonventionen zu reparieren.)

    
CodeRedick 17.06.2009 03:40
quelle
2

Oder Sie könnten eine gespeicherte Prozedur verwenden. Durch die Verwendung eines gespeicherten Proc kann SQL den Ausführungsplan zwischenspeichern. Ich denke, das gleiche gilt für eine Ansicht. Ihre erste Methode (Ad-hoc-Abfrage) wird wahrscheinlich am wenigsten effizient sein.

    
Fantius 17.06.2009 03:36
quelle
2

Es gibt keinen Leistungsunterschied (es sei denn, der Text der SQL-Abfrage ist wirklich gigantisch und verursacht Kosten auf dem Draht).

    
Amy B 17.06.2009 03:37
quelle
1

Die Ansicht kann schneller sein, weil Sie eine kürzere Befehlszeichenfolge anfragen, aber der Unterschied ist inkonsequent.

Der wahre Unterschied und Wert von Views ist, dass sie wie Funktionen und Subroutinen wiederverwendbar sind.

    
RBarryYoung 17.06.2009 03:36
quelle
1

Ansichten sind kein Leistungsmerkmal. Sie existieren, um die Anzahl der Joins zu reduzieren und Ihnen die Denormalisierung ohne Denormalisierung zu ermöglichen.

Mit anderen Worten: Verwenden Sie den Code, der Ihren Code am einfachsten macht, und ändern Sie ihn aus Leistungsgründen nur dann, wenn Sie guten Grund dafür haben. Diese Arten von Optimierungen sind es normalerweise nicht wert.

    
Jason Baker 17.06.2009 04:22
quelle
0

Die Ansicht ist wahrscheinlich eine bessere.

Auf diese Weise können Sie die Abfrage (zur Optimierung) zu einem späteren Zeitpunkt ändern, ohne den Code ändern zu müssen.

    
Josiah 17.06.2009 03:36
quelle
0

Für mich ist der Vorteil von Ansichten, dass Sie einen Sicherheitskontext auf sie anwenden können. In extremen Szenarien können Sie verteilte partitionierte Ansichten aus Leistungsgründen verwenden. Andernfalls komplexieren sie die Versionierung. Sie müssen nun sicherstellen, dass die korrekte Version der Ansicht sowie der neue Build Ihrer Datenzugriffsdll bereitgestellt wird.

Ich habe argumentiert, dass gespeicherte Procs der richtige Weg sind, weil sie a) kompiliert (schneller) und b) eine Sicherheitsgrenze sind. In der realen Welt ist dies oft eine vorzeitige Optimierung. Der SQL-Befehlstext, der vom Client gesendet wird, ist in der Regel ausreichend (und einfacher zu versionieren und bereitzustellen), und die Zugriffssteuerung auf Tabellenebene oder sogar die gesamte Datenbank ist in vielen Fällen ausreichend.

    
Brian Reiter 17.06.2009 03:55
quelle
0

Sofern Sie nicht dem Profil im zweiten Absatz entsprechen, würde ich empfehlen, die Ansichten nicht zu verwenden. Sie sind täuschend verlockend als eine gute Möglichkeit, die zugrunde liegende Funktionalität zu abstrahieren. Das Problem ist jedoch, dass Entwickler, sobald sie mit der Erstellung von Ansichten beginnen, dazu neigen, unterschiedliche Ansichten für jede mögliche Kombination von Tabellen und Feldern zu erstellen, was zu einem unkoordinierten explosiven Durcheinander führt. Der DBA muss dann alle von ihnen verwalten, da es keine Möglichkeit gibt zu sagen, welche tatsächlich verwendet werden und welche nicht, und Entwickler schreiben am Ende nur ihre eigenen Joins, weil es einfacher ist, durchzuwaten und herauszufinden, welche existierende Ansicht es ist verwenden.

IMO, der einzige gute Grund, Ansichten zu verwenden (und eine ziemlich häufige), ist, wenn der DBA die Freiheit haben muss, die zugrunde liegenden Tabellen zu modifizieren, ohne den bestehenden Client-Code zu unterbrechen. Dies ist offensichtlich nur möglich, wenn diese Logik auf der DB-Seite in einer Ansicht oder proc ist. Wenn das für Sie zutrifft, fahren Sie fort und verwenden Sie eine Ansicht. Ansonsten würde ich eine andere Sichtweise empfehlen.

Die Macht einer Ansicht ist die Abstraktion, die sie erzeugt. Tatsache ist, dass die Abstraktion nur vom Kunden und nicht von der DB selbst verwendet wird. Daher finde ich es besser, diese Abstraktion auf die Client-Seite zu stellen. Anstatt eine Ansicht zu definieren, definieren Sie einfach irgendwo im Client-Code einen Makro- oder String-Generator, der Ihre Select-Anweisung für Sie erstellt. Sie können diese auf den ersten und schrittweise komplizierter machen, während Ihre App fortschreitet. Auf diese Weise behalten Sie die Abstraktion und Wiederverwendbarkeit, die eine Ansicht bieten würde, vermeiden jedoch die Explosion von Ansichten und die Engpässe der Entwickler-DBA-Kommunikation.

    
Dax Fohl 09.09.2009 21:20
quelle

Tags und Links