Qual è la differenza tra una procedura memorizzata e una vista?


138

Sono confuso su alcuni punti:

  1. Qual è la differenza tra una procedura memorizzata e una vista?

  2. Quando dovrei usare le stored procedure e quando dovrei usare le viste in SQL Server?

  3. Le viste consentono la creazione di query dinamiche in cui è possibile passare parametri?

  4. Qual è il più veloce e su quale base uno è più veloce dell'altro?

  5. Le viste o le procedure memorizzate allocano la memoria in modo permanente?

  6. Che cosa significa se qualcuno afferma che le viste creano una tabella virtuale, mentre le procedure creano una tabella dei materiali?

Per favore fatemi sapere di più punti, se ce ne sono.

Risposte:


144

Una vista rappresenta una tabella virtuale . È possibile unire più tabelle in una vista e utilizzare la vista per presentare i dati come se i dati provenissero da una singola tabella.

Una procedura memorizzata utilizza parametri per eseguire una funzione ... che si tratti di aggiornare e inserire dati o di restituire singoli valori o set di dati.

Creazione di viste e procedure memorizzate : contiene alcune informazioni di Microsoft su quando e perché utilizzarle.

Di 'che ho due tavoli:

  • tbl_user, Con colonne: user_id, user_name,user_pw
  • tbl_profile, Con colonne: profile_id, user_id,profile_description

Quindi, se mi trovo a eseguire query da quelle tabelle MOLTO ... invece di fare il join in OGNI pezzo di SQL, definirei una vista come:

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

Così, se voglio interrogazione profile_descriptionda user_idin futuro, tutto quello che devo fare è:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Tale codice potrebbe essere utilizzato in una procedura memorizzata come:

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

Quindi, in seguito, posso chiamare:

dbo.getDesc 25

e otterrò la descrizione per user_id25, dove 25è il tuo parametro.

Ovviamente ci sono molti più dettagli, questa è solo l'idea di base.


1
Ma posso unirmi e unirmi a più tabelle nella procedura memorizzata dove non devo fornire parametri.
NoviceToDotNet

5
ma PERCHÉ lo faresti? cosa stai cercando di realizzare? Puoi usare una vista COME una tabella ... le procedure memorizzate servono a FARE cose ... le viste servono a semplificarti la vita.
Patrick

1
Pensa a una vista come a una query memorizzata, quindi se hai due tabelle per le quali devi unirti molto per svolgere il lavoro, puoi creare una vista su cui lavorare in modo da non doverti unire tutte le volte.
Patrick

2
Non capisco, per favore fai qualche altra descrizione.
NoviceToDotNet

2
giusto ma memorizza la tua vista quindi ... in modo da poterla chiamare come una singola tabella. in questo modo crei il tuo join una volta e ogni utilizzo futuro fa riferimento direttamente alla vista che chiama il sql sottostante come se fosse una tabella.
Patrick

107

Un sacco di informazioni disponibili qui

Ecco un buon riassunto:

Una procedura memorizzata:

  • Accetta parametri
  • NON può essere utilizzato come blocco predefinito in una query più grande
  • Può contenere più istruzioni, loop, SE ELSE, ecc.
  • Può eseguire modifiche a una o più tabelle
  • NON può essere utilizzato come destinazione di un'istruzione INSERT, UPDATE o DELETE.

Una vista:

  • Does NON accettare parametri
  • Può essere utilizzato come blocco predefinito in una query più grande
  • Può contenere una sola query SELECT
  • NON è possibile apportare modifiche a nessuna tabella
  • Ma può (a volte) essere utilizzato come destinazione di un'istruzione INSERT, UPDATE o DELETE.

6
Inoltre, Views non deve contenere alcuna clausola "ordina per" o "top"
sksallaj

2
Che cosa significa "NON può essere utilizzato come destinazione di un'istruzione INSERT, UPDATE o DELETE"? Non possiamo usare INSERT, DELETE, UPDATE in Stored Procedure?
Arsman Ahmad,

"Una vista, NON accetta parametri", non è vera? Il video ad esempio: youtube.com/watch?v=zK-mWjUxKpw
xayer

Le viste possono apportare modifiche alla tabella / tabelle di base: csharp-video-tutorials.blogspot.com/2012/09/…
Khurram

8

Per prima cosa devi capire che entrambe sono cose diverse. Stored Proceduressono meglio utilizzati per le INSERT-UPDATE-DELETEdichiarazioni. Considerando che Viewssono usati per le SELECTdichiarazioni. Dovresti usarli entrambi.

Nelle viste non è possibile modificare i dati. Alcuni database sono aggiornabili Visualizzazioni cui è possibile utilizzare INSERT-UPDATE-DELETEsu Views.


2
Puoi modificare i dati nella tabella sottostante usando Views. Le viste sono aggiornabili.
Sviluppatore Dot Net

7

Una vista SQL è una tabella virtuale, che si basa sulla query SQL SELECT. Una vista fa riferimento a una o più tabelle di database esistenti o altre viste. È lo snapshot del database mentre una stored procedure è un gruppo di istruzioni Transact-SQL compilate in un unico piano di esecuzione.

View è una semplice presentazione dei dati archiviati nelle tabelle del database mentre una stored procedure è un gruppo di istruzioni che possono essere eseguite.

Una vista è più veloce in quanto visualizza i dati dalle tabelle a cui fa riferimento mentre una procedura di archivio esegue istruzioni sql.

Consulta questo articolo: Visualizza vs Stored procedure . Esattamente quello che stai cercando


5

Una vista è un modo semplice per salvare un complesso SELECTnel database.

Una procedura di archiviazione viene utilizzata quando il semplice SQL non è sufficiente. Le procedure di archiviazione contengono variabili, cicli e chiamate ad altre procedure memorizzate. È un linguaggio di programmazione, non un linguaggio di query.

  1. Le viste sono statiche. Considerali come nuove tabelle con un determinato layout e i dati in esse contenuti vengono creati al volo usando la query con cui lo hai creato. Come con qualsiasi tabella SQL, è possibile ordinare e filtrare con WHERE, GROUP BYe ORDER BY.

  2. Dipende da cosa fai.

  3. Dipende dal database. Le viste semplici eseguono semplicemente la query e filtrano il risultato. Database come Oracle consentono di creare una vista "materializzata" che è fondamentalmente una tabella che viene aggiornata automaticamente quando i dati sottostanti della vista cambiano.

    Una vista materializzata consente di creare indici sulle colonne della vista (in particolare sulle colonne calcolate che non esistono in nessun punto del database).

  4. Non capisco di cosa stai parlando.


5

Oltre ai commenti sopra, vorrei aggiungere alcuni punti su Views.

  1. Le viste possono essere utilizzate per nascondere la complessità. Immagina uno scenario in cui 5 persone stanno lavorando a un progetto ma solo uno di loro è troppo bravo con elementi del database come join complessi. In tale scenario, può creare viste che possono essere facilmente interrogate da altri membri del team mentre eseguono query su qualsiasi singola tabella.
  2. La sicurezza può essere facilmente implementata da Views. Supponiamo di avere un dipendente da tabella che contenga colonne sensibili come Stipendio , numero SSN . Queste colonne non dovrebbero essere visibili agli utenti che non sono autorizzati a visualizzarle. In tal caso, possiamo creare una Vista selezionando le colonne in una tabella che non richiede alcuna autorizzazione come Nome , Età ecc., Senza esporre colonne sensibili (come Stipendio ecc. Che abbiamo menzionato prima). Ora possiamo rimuovere l'autorizzazione per interrogare direttamente la tabella Employee e mantenere l'autorizzazione di lettura nella vista. In questo modo, possiamo implementare la sicurezza utilizzando Views.

4
  1. Una VISTA è una query dinamica in cui è possibile utilizzare una clausola "WHERE"
  2. Una procedura memorizzata è una selezione di dati fissi, che restituisce un risultato predefinito
  3. Né una vista, né una procedura memorizzata allocare memoria. Solo una visione materializzata
  4. Una TABELLA è solo un'ENTITÀ, una vista può raccogliere dati da ENTITÀ o TAVOLI diversi

4

Mahesh non è del tutto corretto quando suggerisce che non è possibile modificare i dati in una vista. Quindi con il punto di vista di Patrick

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

POSSO aggiornare i dati ... ad esempio posso fare uno di questi ...

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

o

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

Non è possibile INSERIRE a questa vista poiché non tutti i campi in tutta la tabella sono presenti e suppongo che PROFILE_ID sia la chiave primaria e non possa essere NULL. Tuttavia a volte puoi INSERIRE in una vista ...

Ho creato una vista su una tabella esistente usando ...

Create View Junk as SELECT * from [TableName]

POI

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

e

DELETE from Junk Where ID>4

Sia INSERT che DELETE hanno funzionato in questo caso

Ovviamente non è possibile aggiornare i campi che sono aggregati o calcolati, ma qualsiasi vista che è solo una vista diretta dovrebbe essere aggiornabile.

Se la vista contiene più di una tabella, non è possibile inserire o eliminare, ma se la vista è solo un sottoinsieme di una tabella, in genere è possibile.


3

La differenza principale è che quando si esegue una query su una vista, la sua definizione viene incollata nella query. La procedura potrebbe anche dare risultati di query, ma è compilata e per così più veloce. Un'altra opzione sono le viste indicizzate.


1

@Patrick ha ragione con quello che ha detto, ma per rispondere alle tue altre domande una Vista si creerà da sola in Memoria, e in base al tipo di Join, Dati e se c'è qualche aggregazione fatta, potrebbe essere una vista piuttosto affamata di memoria.

Le procedure memorizzate eseguono tutte le loro elaborazioni utilizzando la tabella Hash temporanea, ad esempio # tmpTable1 o in memoria utilizzando @ tmpTable1. A seconda di cosa vuoi dire di fare.

Una Stored procedure è come una funzione, ma viene chiamata direttamente con il suo nome. invece di funzioni effettivamente utilizzate all'interno di una query stessa.

Ovviamente la maggior parte delle volte le tabelle di memoria sono più veloci, se non si stanno recuperando molti dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.