Was ist der Unterschied zwischen einer gespeicherten Prozedur und einer Ansicht?


137

Ich bin verwirrt über ein paar Punkte:

  1. Was ist der Unterschied zwischen einer gespeicherten Prozedur und einer Ansicht?

  2. Wann sollte ich gespeicherte Prozeduren und wann Ansichten in SQL Server verwenden?

  3. Ermöglichen Ansichten die Erstellung dynamischer Abfragen, bei denen Parameter übergeben werden können?

  4. Welches ist das schnellste und auf welcher Basis ist eines schneller als das andere?

  5. Weisen Ansichten oder gespeicherte Prozeduren dauerhaft Speicher zu?

  6. Was bedeutet es, wenn jemand sagt, dass Ansichten eine virtuelle Tabelle erstellen, während Prozeduren eine Materialtabelle erstellen?

Bitte lassen Sie mich weitere Punkte wissen, falls es welche gibt.

Antworten:


143

Eine Ansicht repräsentiert eine virtuelle Tabelle. Sie können mehrere Tabellen in einer Ansicht verbinden und die Ansicht verwenden, um die Daten so darzustellen, als ob die Daten aus einer einzelnen Tabelle stammen würden.

Eine gespeicherte Prozedur verwendet Parameter, um eine Funktion auszuführen ... unabhängig davon, ob sie Daten aktualisiert und einfügt oder einzelne Werte oder Datensätze zurückgibt.

Erstellen von Ansichten und gespeicherten Prozeduren - enthält einige Informationen von Microsoft, wann und warum sie jeweils verwendet werden sollen.

Angenommen, ich habe zwei Tabellen:

  • tbl_user, Mit Säulen: user_id, user_name,user_pw
  • tbl_profile, Mit Säulen: profile_id, user_id,profile_description

Wenn ich also VIEL von diesen Tabellen abfrage ... anstatt den Join in JEDEM SQL-Teil durchzuführen, würde ich eine Ansicht definieren wie:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

Also, wenn ich abfragen möchte profile_description , indem user_idin der Zukunft, alles , was ich zu tun ist :

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Dieser Code kann in einer gespeicherten Prozedur wie der folgenden verwendet werden:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

Also kann ich später anrufen:

dbo.getDesc 25

und ich werde die Beschreibung für bekommen user_id 25 bekommen, wobei das 25Ihr Parameter ist.

Es gibt offensichtlich viel mehr Details, dies ist nur die Grundidee.


1
Aber ich kann beitreten kann mehrere Tabellen in gespeicherten Prozeduren verbinden, wo ich keine Parameter angeben muss.
NoviceToDotNet

5
aber WARUM würdest du das tun? Was versuchst du zu erreichen? Sie können eine Ansicht als Tabelle verwenden ... gespeicherte Prozeduren dienen dazu, Dinge zu tun ... Ansichten erleichtern Ihnen das Leben.
Patrick

1
Stellen Sie sich eine Ansicht als gespeicherte Abfrage vor. Wenn Sie also zwei Tabellen haben, denen Sie häufig beitreten müssen, um die Arbeit zu erledigen, können Sie eine Ansicht erstellen, gegen die Sie arbeiten müssen, damit Sie nicht die ganze Zeit miteinander verknüpfen müssen.
Patrick

2
Ich verstehe nicht, bitte machen Sie etwas mehr Beschreibung.
NoviceToDotNet

2
Richtig, aber es SPEICHERT dann Ihre Ansicht ... damit Sie es wie eine einzelne Tabelle aufrufen können. Auf diese Weise erstellen Sie Ihren Join einmal, und jede zukünftige Verwendung verweist direkt auf die Ansicht, die das zugrunde liegende SQL aufruft, als wäre es eine Tabelle.
Patrick

107

Viele Infos gibt es hier

Hier ist eine gute Zusammenfassung:

Eine gespeicherte Prozedur:

  • Akzeptiert Parameter
  • Kann NICHT als Baustein in einer größeren Abfrage verwendet werden
  • Kann mehrere Anweisungen, Schleifen, IF ELSE usw. enthalten.
  • Kann Änderungen an einer oder mehreren Tabellen vornehmen
  • Kann NICHT als Ziel einer INSERT-, UPDATE- oder DELETE-Anweisung verwendet werden.

Eine Sicht:

  • Hat NICHT Parameter akzeptieren
  • Kann als Baustein in einer größeren Abfrage verwendet werden
  • Kann nur eine einzige SELECT-Abfrage enthalten
  • Kann KEINE Änderungen an einer Tabelle vornehmen
  • Kann aber (manchmal) als Ziel einer INSERT-, UPDATE- oder DELETE-Anweisung verwendet werden.

6
Auch Ansichten sollten keine "order by" - oder "top" -Klauseln enthalten
sksallaj

2
Was bedeutet "kann NICHT als Ziel einer INSERT-, UPDATE- oder DELETE-Anweisung verwendet werden"? Können wir INSERT, DELETE, UPDATE nicht in gespeicherten Prozeduren verwenden?
Arsman Ahmad

"Eine Ansicht akzeptiert KEINE Parameter", stimmt das nicht? Das Video zum Beispiel: youtube.com/watch?v=zK-mWjUxKpw
xayer

Ansichten können Änderungen an Basistabellen
Khurram

8

Zuerst müssen Sie verstehen, dass beide verschiedene Dinge sind. Stored Procedureswerden am besten für INSERT-UPDATE-DELETEAussagen verwendet. Während Viewsfür verwendet werdenSELECT Aussagen verwendet werden. Sie sollten beide verwenden.

In Ansichten können Sie die Daten nicht ändern. Einige Datenbanken haben aktualisierbar Ansichten , wo Sie verwenden können , INSERT-UPDATE-DELETEauf Views.


2
Sie können Daten in der zugrunde liegenden Tabelle mithilfe von Ansichten ändern. Ansichten können aktualisiert werden.
Dot Net Entwickler

7

Eine SQL-Ansicht ist eine virtuelle Tabelle, die auf einer SQL SELECT-Abfrage basiert. Eine Ansicht verweist auf eine oder mehrere vorhandene Datenbanktabellen oder andere Ansichten. Dies ist die Momentaufnahme der Datenbank, während eine gespeicherte Prozedur eine Gruppe von Transact-SQL-Anweisungen ist, die in einem einzigen Ausführungsplan zusammengefasst sind.

View ist eine einfache Darstellung der in den Datenbanktabellen gespeicherten Daten, während eine gespeicherte Prozedur eine Gruppe von Anweisungen ist, die ausgeführt werden können.

Eine Ansicht ist schneller, da sie Daten aus den Tabellen anzeigt, auf die verwiesen wird, während eine Speicherprozedur SQL-Anweisungen ausführt.

Überprüfen Sie diesen Artikel: View vs Stored Procedures . Genau das, wonach Sie suchen


5

Eine Ansicht ist eine einfache Möglichkeit, einen Komplex zu speichern SELECT in der Datenbank zu speichern.

Eine Speicherprozedur wird verwendet, wenn einfaches SQL einfach nicht ausreicht. Speicherprozeduren enthalten Variablen, Schleifen und Aufrufe anderer gespeicherter Prozeduren. Es ist eine Programmiersprache, keine Abfragesprache.

  1. Ansichten sind statisch. Stellen Sie sich diese als neue Tabellen mit einem bestimmten Layout vor, und die darin enthaltenen Daten werden im laufenden Betrieb mit der Abfrage erstellt, mit der Sie sie erstellt haben. Wie bei jeder SQL - Tabelle, können Sie es sortieren und filtern mit WHERE, GROUP BYund ORDER BY.

  2. Das hängt davon ab, was Sie tun.

  3. Das hängt von der Datenbank ab. Einfache Ansichten führen einfach die Abfrage aus und filtern das Ergebnis. Datenbanken wie Oracle ermöglichen es jedoch, eine "materialisierte" Ansicht zu erstellen, bei der es sich im Grunde um eine Tabelle handelt, die automatisch aktualisiert wird, wenn sich die zugrunde liegenden Daten der Ansicht ändern.

    In einer materialisierten Ansicht können Sie Indizes für die Spalten der Ansicht erstellen (insbesondere für die berechneten Spalten, die an keiner Stelle in der Datenbank vorhanden sind).

  4. Ich verstehe nicht, wovon du sprichst.


5

Zusätzlich zu den obigen Kommentaren möchte ich einige Punkte zu Ansichten hinzufügen.

  1. Ansichten können verwendet werden, um die Komplexität zu verbergen. Stellen Sie sich ein Szenario vor, in dem 5 Personen an einem Projekt arbeiten, aber nur eine von ihnen zu gut mit Datenbank-Dingen wie komplexen Verknüpfungen umgehen kann. In einem solchen Szenario kann er Ansichten erstellen, die von anderen Teammitgliedern leicht abgefragt werden können, wenn sie eine einzelne Tabelle abfragen.
  2. Sicherheit kann einfach durch Ansichten implementiert werden. Angenommen , wir eine Tabelle Mitarbeiter , die empfindliche Spalten wie enthält Gehalt , SSN Nummer . Diese Spalten sollten für Benutzer, die nicht zum Anzeigen berechtigt sind, nicht sichtbar sein. In diesem Fall können wir eine Ansicht erstellen, in der die Spalten in einer Tabelle ausgewählt werden, für die keine Berechtigung wie Name , Alter usw. erforderlich ist , ohne dass vertrauliche Spalten (wie das zuvor erwähnte Gehalt usw.) verfügbar gemacht werden. Jetzt können wir die Berechtigung zum direkten Abfragen der Tabelle Employee entfernen und die Leseberechtigung für die Ansicht beibehalten. Auf diese Weise können wir Sicherheit mithilfe von Ansichten implementieren.

4
  1. Eine VIEW ist eine dynamische Abfrage, bei der Sie eine "WHERE" -Klausel verwenden können
  2. Eine gespeicherte Prozedur ist eine feste Datenauswahl, die ein vordefiniertes Ergebnis zurückgibt
  3. Weder eine Ansicht noch eine gespeicherte Prozedur weisen Speicher zu. Nur eine materialisierte Ansicht
  4. Eine TABELLE ist nur eine ENTITÄT. Eine Ansicht kann Daten von verschiedenen ENTITÄTEN oder TABELLEN sammeln

4

Mahesh ist nicht ganz richtig, wenn er vorschlägt, dass Sie die Daten in einer Ansicht nicht ändern können. Also mit Patricks Sicht

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

Ich kann die Daten aktualisieren ... als Beispiel kann ich beides tun ...

Update vw_user_profile Set profile_description='Manager' where user_id=4

oder

Update tbl_profile Set profile_description='Manager' where user_id=4

Sie können diese Ansicht nicht einfügen, da nicht alle Felder in der gesamten Tabelle vorhanden sind und ich davon ausgehe, dass PROFILE_ID der Primärschlüssel ist und nicht NULL sein kann. Sie können jedoch manchmal in eine Ansicht EINFÜGEN ...

Ich habe eine Ansicht für eine vorhandene Tabelle mit ...

Create View Junk as SELECT * from [TableName]

DANN

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

und

DELETE from Junk Where ID>4

In diesem Fall funktionierten sowohl INSERT als auch DELETE

Natürlich können Sie keine Felder aktualisieren, die aggregiert oder berechnet sind, aber jede Ansicht, die nur eine gerade Ansicht ist, sollte aktualisierbar sein.

Wenn die Ansicht mehr als eine Tabelle enthält, können Sie sie nicht einfügen oder löschen. Wenn die Ansicht jedoch nur eine Teilmenge einer Tabelle ist, können Sie dies normalerweise tun.


3

Der Hauptunterschied besteht darin, dass beim Abfragen einer Ansicht deren Definition in Ihre Abfrage eingefügt wird. Prozedur könnte auch Ergebnisse der Abfrage liefern, aber es wird kompiliert und für so schneller. Eine weitere Option sind indizierte Ansichten.


2

Aussicht :

  • Akzeptiert keine Parameter
  • Es kann als Baustein in der großen Abfrage verwendet werden.
  • Es kann nur eine einzige Select-Abfrage enthalten.
  • Es können keine Änderungen an einer Tabelle vorgenommen werden.
  • Es kann (manchmal) als Ziel für das Einfügen, Aktualisieren und Löschen von Abfragen verwendet werden.

Gespeicherte Prozedur :

  • Parameter akzeptieren
  • Es kann nicht als Baustein in der großen Abfrage verwendet werden.
  • Es kann mehrere Anweisungen enthalten, z. B. if, else, loop usw.
  • Es kann Änderungen an einer oder mehreren Tabellen vornehmen.
  • Wird als Ziel für das Einfügen, Aktualisieren und Löschen von Abfragen verwendet.

View vs Stored procedure


1

@Patrick stimmt mit dem überein, was er gesagt hat, aber um Ihre anderen Fragen zu beantworten, wird sich eine Ansicht im Speicher erstellen. Abhängig von der Art der Verknüpfungen, Daten und wenn eine Aggregation durchgeführt wird, kann es sich um eine ziemlich speicherhungrige Ansicht handeln.

Gespeicherte Prozeduren führen ihre gesamte Verarbeitung entweder mithilfe der Temp-Hash-Tabelle aus, z. B. # tmpTable1, oder im Speicher mithilfe von @ tmpTable1. Je nachdem, was Sie ihm sagen möchten.

Eine gespeicherte Prozedur ähnelt einer Funktion, wird jedoch direkt mit ihrem Namen aufgerufen. anstelle von Funktionen, die tatsächlich in einer Abfrage selbst verwendet werden.

Offensichtlich sind Speichertabellen die meiste Zeit schneller, wenn Sie nicht viele Daten abrufen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.