Viste o StoredProcedure??

lunedì 31 dicembre 2012 - 17.27
Tag Elenco Tags  VB.NET  |  SQL Server 2008 R2

86Marco Profilo | Expert

Buon pomeriggio amici.
una domanda troppo banale per voi ma non per me.

Mi sn avvicinato da poco ad SQL Server e devo dire che ho creato un semplice progettino interfacciato con VB.NET che funziona bene.

Leggendo un buon manuale SQL Server mi sorge un dubbio sulla differenza sostanziale che passa tra una semplice query (storedprocedure) ed una vista.

Ho capito che la Vista (semplice non indicizzata) è una sorta di tabella virtuale ma per quale motivo sarebbe più opportuno preferire una vista ad una query?

In poche parole se devo farmi una select dei record della mia tabella anagrafica che differenza passa tra il fare una storedprocedure "SELECT ... ecc ecc..." ed una vista?

In quale scenario potrebbe essere utile utilizzare una vista piuttosto che una storedprocedure?

Sperando di poter ottenere il Vostro aiuto, come sempre d'altronde, ne approfitto per augurarvi a tutti un buon 2013!

andrestu Profilo | Expert

premetto che non sono un esperto, la prima cosa che mi viene in mente è che FORSE con la vista puoi strutturare la query dinamicamente, e cioè ammettiamo che io devo creare a runtime la stringa che mi fa la query, con la vista posso farlo "SELECT MYVIEW WHERE..." non so se con la SP si può fare... forse si, non saprei

Andrea Restucci - Web Developer

86Marco Profilo | Expert

Intanto grazie... per non credo sia come dici tu

andrestu Profilo | Expert

beh allora se non è come dico io vuol dire che si può formulare una query a questo modo:

"SELECT MY_STORED_PROCEDURE WHERE ... "

mmm sinceramente non ho mai provato ma non mi sembra così "a naso" che possa funzionare...
forse però mi sbaglio, attendiamo il verdetto di qualche esperto.

Andrea Restucci - Web Developer

86Marco Profilo | Expert

Ei ciao.
Avevo letto male.
Effettivamente la select da una vista posso farla come dici tu ma da una stored procedure no.
Il mio "non credo sia come dici tu" era riferito al fatto che non credo che la differenza stia solo in ciò che tu mi hai detto :-).

Ciò che dicevi è effettivamente vero ma ripeto non credo che la differenza tra view e storedp stia solo in quello.

andrestu Profilo | Expert

ok, allora rimaniamo in attesa di qualche info aggiuntive da qualcuno.

Andrea Restucci - Web Developer

86Marco Profilo | Expert

Non c'è nessuno??? :(

alx_81 Profilo | Guru

eccomi..
dunque dunque dunque.. discorso molto delicato.
Partiamo da una premessa, la stored procedure è una cosa non paragonabile a query o viste. Quindi direi di non approfondire, perchè ci vorrebbero ore e ore di discussioni sull'argomento
Quindi non compariamole, ma vediamo di capire i vantaggi di una soluzione basata su query/viste rispetto ad una con stored procedure.
Parlo anche per esperienza personale, anche perchè quando si parla di queste cose c'è da stare anche sul "soggettivo".

Perchè una soluzione a stored procedure?
Primo motivo che mi viene, perchè è estremamente modulare, trattandosi di una vera e propria procedura (sottoprogramma) e "chiamabile" in più punti.
Poi, nel caso di refactor/modifica i punti di manutenzione sono centralizzati.
Inoltre previene il sql injection, che non è poco, ma non è l'unica struttura che li evita (mio articolo: http://www.dotnethell.it/articles/SQL-Injection-Tutorial-Security.aspx).
Poi, ci si può legare al motore (linguaggio proprietario t-sql) e non devo preoccuparmi di fare cross platform (mysql, oracle, ..).
Ancora, la security, altamente personalizzabile. E' infatti possibile tenere lontani i chiamanti dal vero e proprio modello (tabelle) per decidere come i chiamanti stessi devono operare sugli oggetti (limiti di profilazione).
E' possibile inoltre aggiungere in esse alcune logiche di business (IF, WHILE, creazione di oggetti temporanei).
Infine, le performance! Il piano di esecuzione calcolato durante la compilazione della stored procedure (sì, è compilata) è in cache e durante l'esecuzione del comando al suo interno, il piano non deve necessariamente essere ricreato, risparmiando quel tempo durante la submit del comando.
Poi potremmo aggiungere.. debug, set di alcune opzioni, gestione transazioni, possono essere .net CLR stored procedure, ecc..

Perchè una soluzione a query/viste?
Voglio decidere dall'applicazione che query lanciare e quindi comporla dinamicamente.
Non mi devo legare al db server e devo supportare mille tipi di database.
Mi posso permettere di dare accesso agli oggetti tabelle/viste.
Voglio usare linq to sql o entity framework al meglio con elasticità.

Detto questo, differenza tra utilizzo di viste o meno.
Sì, quello che dice Andrea è corretto, non posso fare una select from sp, ma posso fare una select from Function (che non è poi così differente a livello di sintassi). Tuttavia, non si può fare, se non con una INSERT tabella EXEC stored_procedure e POI, SELECT campi FROM tabella. Ma questo non è il punto a mio avviso focale. Le viste, oltre a garantire modularità, sono fatte per aumentare il livello di astrazione, tenendo, di fatto, i chiamanti lontani dalle tabelle (sì, anche le sp). Con semplici filtri è possibile fornire SOLO un set di dati all'utente, organizzati in maniera più orientata all'esigenza dell'utente (nascondendo campi per uso interno ad esempio). Inoltre è molto importante se vogliamo fare refactor. Pensate al rinomina di una tabella mentre si lavora (o se si deve rilasciare), può essere un ottimo punto di "appoggio". Inoltre, se usate con le stored procedure, aumentano la modularità, perchè una particolare query (ad esempio "lista dei clienti attivi") verrà di certo riutilizzata in una marea di punti chiave.
Infine, una vista, si comporta come una subquery, il che aiuta il motore durante l'ottimizzazione dello statement.

Però la vista ha degli svantaggi:
- filtri solo con COSTANTI al suo interno
- non si sincronizzano (pensare al select * in una vista, non si sincronizza se le tabelle sotto cambiano)
- non accettano parametri (cosa che una table function invece consente)
- non accettano order by se non con TOP indicato (corretto, mai mettere order by nelle viste, visto che sono subquery)

spero di aver risposto almeno in parte alle domande..
ciao e un buon anno a tutti!

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

ecco questo è quello che possiamo definire il parere di un esperto !!!
e se prima avevo un solo dubbio ora invece sono molteplici...


Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>e se prima avevo un solo dubbio ora invece sono molteplici...
Se vuoi discuterne no problem, io ci sono sempre :)
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

Grazie Alex,
per il momento anche volendo non ho molto tempo per analizzare nel dettaglio tutte le tue preziose indicazioni, mi tornerà sicuramente utile la discussionre a tempo debito...


Andrea Restucci - Web Developer
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5