Forse ha senso, per rivolgere la domanda e trovare casi in cui le procedure memorizzate solo potrebbero fare, cosa vuoi ottenere. Forse ci sono davvero casi d'uso, in cui le stored procedure risaltano.
If it makes a difference, I am using MSSQL and Entity Framework.
La mia conoscenza di EF è limitata, ma per quanto posso vedere, EF è ( just ) un ORM come qualsiasi altro; e fortunatamente è in grado di utilizzare SQL raw .
Se prendo i tuoi due punti principali:
A complicated report that was taking minutes to run (this was a page in a web app). I found I could write SQL that was much more efficient (only taking seconds to run) than what LINQ was providing.
LINQ / EF non era all'altezza, quando si eseguiva un rapporto. E come hai notato, era SQL
molto più veloce, rispetto all'utilizzo di un ORM. Ma parla a favore delle stored procedure o solo contro l'uso di ORM per tutto?
Il tuo problema potrebbe ovviamente essere risolto con SQL . Se questa query è stata archiviata e la versione controllata nel codice base fa - secondo il tuo esempio - almeno nessuna differenza .
A web application needed to read and write to a few tables on a separate database which contained a lot of other, sensitive information that was irrelevant to the application. Rather than giving it access to everything, I used a stored procedure that only does what is needed, and only returns limited information. The web application could then be given access to this stored procedure only, without access to any tables etc.
La stessa cosa qui: una semplice stringa di connessione e e UPDATE e il tuo problema è stato risolto. Questo problema può essere risolto anche con un ORM :
semplicemente usa un webservice di fronte all'altro DB e lo stesso compartementalization / isolamento è raggiunto.
Quindi niente da vedere qui.
Osservando alcuni punti che altri hanno fatto:
You have complex units of work, perhaps involving many tables, that cannot be wrapped in a transaction easily using the features of EF.
Ma SQL
può farlo. Nessuna magia coinvolta qui.
Your database does not play well with EF
Ancora: usa EF quando appropriato.
You need to work with data that crosses server boundaries with linked servers
Non vedo, come aiutano le stored procedure. Quindi non posso vedere un vantaggio delle stored procedure; ma forse qualcuno fa luce su questo.
You have very complex data retrieval scenarios where "bare metal" SQL is needed in order to ensure adequate performance
Ancora: "Limiti di EF ".
Your application does not have full CRUD permissions on a table but your application can be allowed to run under a security context that your server trusts
Va bene. Vado con un forse .
Finora è stato effettuato un solo punto mezzo a favore delle stored procedure.
Forse ci sono considerazioni sulle prestazioni, che parlano a favore delle stored procedure.
1) La memorizzazione di query ha il vantaggio di una chiamata semplice alla stored procedure che incapsula la complessità. Poiché la query planer conosce la query, è "più semplice" ottimizzare. Ma i salvataggi sono con l'attuale piallatore di query sofisticato _minimal.
Inoltre, anche se c'è un leggero costo usando le query ad hoc , se i tuoi dati sono ben strutturati e accuratamente indicizzati, il database è semplicemente il < em> bottleneck della tua applicazione. Quindi, anche se c'è un piccolo delta, è trascurabile considerando altri fattori.
2) Tuttavia è stato discusso per la memorizzazione di query complesse in un DB.
Ci sono due cose da considerare:
a) le query complesse fanno un uso massiccio dell'infrastruttura DB, che aumenta i tempi di risposta per ogni altra query. Non è possibile eseguire molte query costose in parallelo . Questo non parla né di pro né di contra stored procedure, ma di query complesse .
b) Se la query richiede comunque del tempo, perché preoccuparsi di vincere a bassa velocità di una stored procedure.
tl; dr
Nulla parla direttamente contro stored procedure. Quindi usare le stored procedure è ok - se ti rende felice.
Ma d'altra parte: non potrei immaginare un use case appropriato che parli inequivocabilmente pro.
When should I use stored procedures?
La risposta corretta è: Ogni volta che ti piace . Ma ci sono altre opzioni.