Jaka jest różnica między procedurą składowaną a widokiem?


138

Jestem zdezorientowany w kilku punktach:

  1. Jaka jest różnica między procedurą składowaną a widokiem?

  2. Kiedy należy używać procedur składowanych, a kiedy widoków w programie SQL Server?

  3. Czy widoki pozwalają na tworzenie dynamicznych zapytań, w których możemy przekazywać parametry?

  4. Który jest najszybszy i na jakiej podstawie jeden jest szybszy od drugiego?

  5. Czy widoki lub procedury składowane przydzielają pamięć na stałe?

  6. Co to znaczy, jeśli ktoś mówi, że widoki tworzą wirtualną tabelę, a procedury tworzą tabelę materiałów?

Daj mi znać o kolejnych punktach, jeśli takie są.

Odpowiedzi:


144

Widok reprezentuje wirtualną tabelę. Możesz połączyć wiele tabel w widoku i używać widoku do przedstawiania danych tak, jakby pochodziły z jednej tabeli.

Procedura składowana używa parametrów do wykonywania funkcji ... niezależnie od tego, czy aktualizuje i wstawia dane, czy zwraca pojedyncze wartości lub zestawy danych.

Tworzenie widoków i procedur składowanych - zawiera pewne informacje od firmy Microsoft, kiedy i dlaczego należy ich używać.

Powiedzmy, że mam dwie tabele:

  • tbl_userZ kolumn: user_id, user_name,user_pw
  • tbl_profileZ kolumn: profile_id, user_id,profile_description

Tak więc, jeśli znajdę dużo zapytań z tych tabel ... zamiast wykonywać sprzężenie w KAŻDYM fragmencie SQL, zdefiniowałbym widok taki:

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

Tak więc, jeśli chcę zapytania profile_descriptiono user_idprzyszłości, wszystko co musisz zrobić, to:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Tego kodu można użyć w procedurze składowanej, takiej jak:

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

Więc później mogę zadzwonić:

dbo.getDesc 25

i otrzymam opis dla user_id25, gdzie 25jest twój parametr.

Jest oczywiście dużo więcej szczegółów, to tylko podstawowa idea.


1
Ale mogę dołączyć, można dołączyć do wielu tabel w procedurze składowanej, gdzie nie muszę podawać parametru.
NoviceToDotNet

5
ale DLACZEGO byś to zrobił? co próbujesz osiągnąć? Możesz używać widoku JAKO tabeli ... procedury składowane służą do ROBIENIA rzeczy ... widoki służą do ułatwienia życia.
Patrick,

1
Pomyśl o widoku jako przechowywanym zapytaniu, więc jeśli masz dwie tabele, do których musisz dużo dołączyć, aby wykonać pracę, możesz utworzyć widok, z którym będziesz pracować, aby nie musieć dołączać do nich za każdym razem.
Patrick,

2
Nie rozumiem, proszę o trochę więcej opisu.
NoviceToDotNet

2
racja, ale ZAPISUJE twój widok ... tak, że możesz go nazwać jak pojedynczą tabelą. w ten sposób tworzysz swoje sprzężenie raz, a wszelkie przyszłe zastosowania odwołują się bezpośrednio do widoku, który wywołuje bazowy sql tak, jakby był tabelą.
Patrick,

107

Wiele informacji dostępnych tutaj

Oto dobre podsumowanie:

Procedura składowana:

  • Akceptuje parametry
  • NIE może być używany jako element konstrukcyjny w większym zapytaniu
  • Może zawierać kilka instrukcji, pętli, IF ELSE itp.
  • Potrafi modyfikować jedną lub kilka tabel
  • NIE MOŻE być używane jako cel instrukcji INSERT, UPDATE lub DELETE.

Widok:

  • Czy nie akceptuje parametrów
  • Może służyć jako element konstrukcyjny w większym zapytaniu
  • Może zawierać tylko jedno zapytanie SELECT
  • Może nie wykonać modyfikacje do każdej tabeli
  • Ale może (czasami) służyć jako cel instrukcji INSERT, UPDATE lub DELETE.

6
Również widoki nie powinny zawierać żadnych klauzul „order by” ani „top”
sksallaj

2
Co oznacza sformułowanie „NIE może być używane jako cel instrukcji INSERT, UPDATE lub DELETE”? Czy nie możemy użyć INSERT, DELETE, UPDATE w procedurze składowanej?
Arsman Ahmad

„Widok NIE akceptuje parametrów”, to nieprawda? Na przykład wideo: youtube.com/watch?v=zK-mWjUxKpw
xayer

Widoki mogą modyfikować tabelę / tabele bazowe
Khurram

8

Najpierw musisz zrozumieć, że obie są różne. Stored Proceduresnajlepiej używać do INSERT-UPDATE-DELETEstwierdzeń. Natomiast Viewssą używane do SELECTstwierdzeń. Powinieneś użyć obu z nich.

W widokach nie można zmieniać danych. Niektóre bazy danych mają możliwych do zaktualizowania Wyświetleń gdzie można używać INSERT-UPDATE-DELETEna Views.


2
Możesz zmieniać dane w tabeli bazowej za pomocą widoków. Widoki można aktualizować.
Deweloper Dot Net

7

Widok SQL to wirtualna tabela oparta na zapytaniu SQL SELECT. Widok odwołuje się do jednej lub kilku istniejących tabel bazy danych lub innych widoków. Jest to migawka bazy danych, podczas gdy procedura składowana to grupa instrukcji języka Transact-SQL skompilowanych w jeden plan wykonania.

Widok to proste prezentowanie danych przechowywanych w tabelach bazy danych, podczas gdy procedura składowana to grupa instrukcji, które można wykonać.

Widok jest szybszy, ponieważ wyświetla dane z tabel, do których się odwołuje, podczas gdy procedura magazynu wykonuje instrukcje sql.

Zobacz ten artykuł: Wyświetlanie a procedury składowane . Dokładnie to, czego szukasz


5

Widok to prosty sposób na zapisanie złożonego obiektu SELECTw bazie danych.

Procedura składowania jest używana, gdy prosty SQL po prostu nie wystarczy. Procedury składowane zawierają zmienne, pętle i wywołania innych procedur składowanych. To język programowania, a nie język zapytań.

  1. Widoki są statyczne. Pomyśl o nich jak o nowych tabelach z określonym układem, a dane w nich są tworzone w locie przy użyciu zapytania, które je utworzyłeś. Podobnie jak w przypadku każdej tabeli SQL, możesz ją sortować i filtrować za pomocą WHERE, GROUP BYi ORDER BY.

  2. To zależy od tego, co robisz.

  3. Zależy od bazy danych. Proste widoki po prostu uruchamiają zapytanie i filtrują wynik. Jednak bazy danych, takie jak Oracle, pozwalają na utworzenie „zmaterializowanego” widoku, który jest w zasadzie tabelą aktualizowaną automatycznie, gdy zmieniają się podstawowe dane widoku.

    Widok zmaterializowany umożliwia tworzenie indeksów na kolumnach widoku (szczególnie na kolumnach obliczeniowych, które nie istnieją nigdzie w bazie danych).

  4. Nie rozumiem, o czym mówisz.


5

Oprócz powyższych uwag chciałbym dodać kilka punktów dotyczących widoków.

  1. Widoki mogą służyć do ukrycia złożoności. Wyobraź sobie scenariusz, w którym 5 osób pracuje nad projektem, ale tylko jedna z nich radzi sobie zbyt dobrze z takimi elementami bazy danych, jak złożone łączenia. W takim scenariuszu może tworzyć widoki, które mogą być łatwo odpytywane przez innych członków zespołu, gdy wysyłają zapytania do dowolnej pojedynczej tabeli.
  2. Zabezpieczenia można łatwo wdrożyć przez widoki. Załóżmy, że jesteśmy pracownikiem tabeli, który zawiera poufne kolumny, takie jak wynagrodzenie , numer SSN . Kolumny te nie powinny być widoczne dla użytkowników, którzy nie mają uprawnień do ich przeglądania. W takim przypadku możemy stworzyć Widok, wybierając kolumny w tabeli, które nie wymagają żadnej autoryzacji, jak imię , wiek itp., Bez ujawniania wrażliwych kolumn (takich jak wynagrodzenie itp., O których wspomnieliśmy wcześniej). Teraz możemy usunąć uprawnienia do bezpośredniego wysyłania zapytań do tabeli Pracownik i po prostu zachować uprawnienie do odczytu w widoku. W ten sposób możemy zaimplementować zabezpieczenia przy użyciu widoków.

4
  1. WIDOK to dynamiczne zapytanie, w którym można użyć klauzuli „GDZIE”
  2. Procedura składowana to ustalony wybór danych, który zwraca wstępnie zdefiniowany wynik
  3. Ani widok, ani procedura składowana przydziela pamięć. Tylko zmaterializowany pogląd
  4. TABELA to tylko jeden ENTITY, widok może zbierać dane z różnych ENTITIES lub TABLES

4

Mahesh nie ma racji, sugerując, że nie można zmieniać danych w widoku. Tak jest z poglądem Patricka

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

MOGĘ zaktualizować dane ... na przykład mogę zrobić jedno z poniższych ...

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

lub

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

Nie możesz WSTAWIĆ do tego widoku, ponieważ nie wszystkie pola w całej tabeli są obecne i zakładam, że PROFILE_ID jest kluczem podstawowym i nie może mieć wartości NULL. Jednak czasami możesz WSTAWIĆ do widoku ...

Utworzyłem widok na istniejącej tabeli za pomocą ...

Create View Junk as SELECT * from [TableName]

NASTĘPNIE

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

i

DELETE from Junk Where ID>4

W tym przypadku zadziałały zarówno INSERT, jak i DELETE

Oczywiście nie można aktualizować żadnych pól, które są agregowane lub obliczane, ale każdy widok, który jest tylko widokiem prostym, powinien być aktualizowany.

Jeśli widok zawiera więcej niż jedną tabelę, nie można wstawiać ani usuwać, ale jeśli widok jest podzbiorem tylko jednej tabeli, zwykle jest to możliwe.


3

Główna różnica polega na tym, że podczas wykonywania zapytania dotyczącego widoku jego definicja jest wklejana do zapytania. Procedura mogłaby również dać wyniki zapytania, ale jest ona kompilowana i przez to szybciej. Inną opcją są widoki indeksowane.


1

@Patrick ma rację w tym, co powiedział, ale aby odpowiedzieć na Twoje inne pytania, Widok utworzy się w pamięci iw zależności od typu połączeń, danych i jeśli zostanie wykonana agregacja, może to być widok wymagający dużej ilości pamięci.

Procedury składowane wykonują całe swoje przetwarzanie za pomocą Temp Hash Table, np. # TmpTable1 lub w pamięci przy użyciu @ tmpTable1. W zależności od tego, co chcesz mu powiedzieć.

Procedura składowana jest podobna do funkcji, ale jest nazywana bezpośrednio z nazwy. zamiast funkcji, które są faktycznie używane wewnątrz samego zapytania.

Oczywiście w większości przypadków tablice pamięci są szybsze, jeśli nie pobierasz dużej ilości danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.