Perché l'SQL parametrizzato generato da NHibernate è veloce quanto una procedura memorizzata?

StackOverflow https://stackoverflow.com/questions/50346

  •  09-06-2019
  •  | 
  •  

Domanda

Uno dei miei colleghi afferma che, anche se il percorso di esecuzione è memorizzato nella cache, non è possibile che l'SQL parametrizzato generato da un ORM sia veloce quanto una procedura memorizzata.Qualche aiuto con questo sviluppatore testardo?

È stato utile?

Altri suggerimenti

Round 1: puoi avviare una traccia del profiler e confrontare i tempi di esecuzione.

Per la maggior parte delle persone, il modo migliore per convincerli è "mostrare loro la prova". In questo caso, creerei un paio di casi di test di base per recuperare lo stesso set di dati, e poi il tempo impiegato dall'uso delle procedure memorizzate rispetto a nhibernate.Una volta ottenuti i risultati, consegnateli e le persone più scettiche dovrebbero arrendersi all’evidenza.

Vorrei solo aggiungere un paio di cose alla risposta di Rob:

Innanzitutto, assicurati che la quantità di dati coinvolti nei casi di test sia simile ai valori di produzione.In altre parole, se le tue query riguardano normalmente tabelle con centinaia di migliaia o righe, crea un ambiente di test di questo tipo.

In secondo luogo, rendere tutto uguale tranne l'uso di una query generata da nHibernate e di una chiamata s'proc.Si spera che tu possa eseguire il test semplicemente scambiando un provider.

Infine, renditi conto che di solito c'è molto di più in gioco oltre alle semplici procedure memorizzate rispetto a procedure memorizzate.ORM.Tenendo presente questo, il test dovrebbe esaminare tutti i fattori:tempo di esecuzione, consumo di memoria, scalabilità, capacità di debug, ecc.

Il problema qui è che hai accettato l'onere della prova.È improbabile che tu possa cambiare idea a qualcuno in questo modo.Piaccia o no, le persone, anche i programmatori, sono semplicemente troppo emotive per lasciarsi influenzare facilmente dalla logica.Devi rimettergli l'onere della prova, convincerlo a convincerti del contrario, e questo lo costringerà a fare la ricerca e scoprire la risposta da solo.

Un argomento migliore per utilizzare le procedure memorizzate è la sicurezza.Se usi soltanto procedure memorizzate, con NO sql dinamico, è possibile disabilitare le autorizzazioni SELECT, INSERT, UPDATE, DELETE, ALTER e CREATE per l'utente del database dell'applicazione.Ciò ti proteggerà dalla maggior parte delle SQL Injection di 2° ordine, mentre le query parametrizzate sono efficaci solo contro l'iniezione di primo ordine.

Misurarlo, ma in un benchmark non micro, ad es.qualcosa che rappresenta le operazioni reali nel tuo sistema.Anche se ci fosse un piccolo vantaggio in termini di prestazioni per una procedura memorizzata, sarebbe insignificante rispetto agli altri costi sostenuti dal tuo codice:effettivamente recuperare i dati, convertirli, visualizzarli, ecc.Per non parlare del fatto che l'utilizzo delle procedure memorizzate equivale a diffondere la logica sulla tua app E il tuo database senza alcun controllo di versione significativo, test unitari o supporto per il refactoring in quest'ultimo.

Confrontalo tu stesso.Scrivi una classe di test che esegua una procedura memorizzata campionata alcune centinaia di volte ed esegui il codice Hibernate lo stesso numero di volte.Confronta il tempo di esecuzione medio e mediano di ciascun metodo.

È altrettanto veloce se la query è la stessa ogni volta.SQL Server 2005 memorizza nella cache i piani di query a livello di ciascuna istruzione in un batch, indipendentemente dalla provenienza dell'SQL.

La differenza a lungo termine potrebbe essere che le procedure memorizzate sono molto, molte volte più facili da gestire e ottimizzare per un DBA, mentre centinaia di query diverse che devono essere raccolte dalle tracce del profiler sono un incubo.

Ho avuto questa discussione molte volte.
Quasi sempre finisco per prendere un dba davvero buono, eseguire un proc e un pezzo di codice con il profiler in esecuzione e fare in modo che il dba mostri che i risultati sono così vicini che sono trascurabili.

Misuralo.

In realtà, qualsiasi discussione su questo argomento è probabilmente inutile finché non lo hai misurato.

Potrebbe avere ragione per il caso d'uso specifico a cui sta pensando.Una procedura memorizzata verrà probabilmente eseguita più velocemente per alcuni set complessi di SQL, che possono essere ottimizzati arbitrariamente.Tuttavia, qualcosa che ottieni da cose come l'ibernazione è la memorizzazione nella cache.Ciò potrebbe rivelarsi molto più rapido per tutta la durata dell'applicazione effettiva.

L'ulteriore livello di astrazione lo renderà più lento di una pura chiamata a sproc.Proprio per il fatto che hai allocazioni aggiuntive sull'heap gestito e ulteriori push e pop dallo stack di chiamate, la verità è che è più efficiente chiamare uno sproc piuttosto che avere un ORM che crea la query, indipendentemente da quanto sia buona la L'ORM è.

Quanto sia lento, ammesso che sia misurabile, è discutibile.Ciò è aiutato anche dal fatto che la maggior parte degli ORM dispone di un meccanismo di memorizzazione nella cache per evitare del tutto di eseguire la query.

Anche se la procedura memorizzata è più veloce del 10% (probabilmente non lo è), potresti chiederti quanto sia veramente importante.Ciò che conta davvero, alla fine, è quanto sia facile scrivere e mantenere il codice per il tuo sistema.Se stai codificando un'app Web e tutte le tue pagine vengono restituite in 0,25 secondi, il tempo aggiuntivo risparmiato utilizzando le procedure memorizzate è trascurabile.Tuttavia, ci possono essere molti vantaggi aggiuntivi nell'usare un ORM come NHibernate, che sarebbe estremamente difficile da duplicare utilizzando solo le procedure memorizzate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top