Efficacia delle procedure memorizzate rispetto alle query non elaborate


23

Ho letto molto su entrambi i lati di questo dibattito: c'è un significativo guadagno in termini di prestazioni usando solo le stored procedure su query non elaborate? Sono specificamente interessato a SQL Server ma sarei interessato a tutti i database.


2
Puoi pubblicare link ad alcune delle cose che hai letto? Non credo che la performance sia in gioco qui (almeno non direttamente)
Jack Douglas,

1
@JackDouglas, controlla la risposta di mrdenny. Le prestazioni fanno parte di questa domanda / risposta.
Thomas Stringer,

Risposte:


31

Lo è meno in SQL Server 2008 e versioni successive, ma è ancora lì. Ciò a cui si riferisce è che la cache del piano di esecuzione e SQL Server sono in grado di parametrizzare automaticamente le query inviate. Quando si utilizzano procedure memorizzate (che non dispongono di SQL dinamico al loro interno), le query sono già parametrizzate, quindi SQL Server non lo fa " Non è necessario generare un piano per ogni query quando viene eseguito poiché i piani sono già archiviati nella cache del piano.

E non dimenticare i problemi di sicurezza (SQL dinamico, autorizzazioni minime, ecc.) Che scompaiono quando si utilizzano le stored procedure.

Quando l'app utilizza SQL dinamico rispetto alle tabelle di base per selezionare, inserire, aggiornare ed eliminare i dati nelle tabelle, l'applicazione deve disporre dei diritti su tutti quegli oggetti direttamente. Quindi, se qualcuno utilizza SQL Injection per accedere al server, avrà i diritti per eseguire query, modificare o eliminare tutti i dati in quelle tabelle.

Se si utilizzano procedure memorizzate, hanno solo i diritti per eseguire le procedure memorizzate recuperando solo le informazioni che la procedura memorizzata restituirebbe. Invece di emettere una dichiarazione di eliminazione rapida e soffiare via tutto ciò che avrebbero bisogno di capire quali procedure possono essere utilizzate per eliminare i dati, quindi capire come utilizzare la procedura per farlo.

Dato che SQL Injection è il modo più semplice per accedere a un database, questo è molto importante.


@mrdenny - puoi ottenere lo stesso effetto con le "query non elaborate" se sono parametrizzate?
Jack Douglas,

Sì, se sono completamente parametrizzati. Tuttavia, ciò non risolve i problemi di sicurezza risolti con le procedure memorizzate.
mrdenny,

10

Come addendum alla risposta di Denny, non è raro trovare sistemi in cui viene sprecata una significativa memoria del pool di buffer in piani di esecuzione ad hoc a singolo o basso utilizzo, creati a seguito di query utilizzate su procs.

Casi peggiori di recente, 8 GB assegnati a un'istanza, cache del piano da 3 GB, piani monouso da 2,5 GB. La maggior parte di questi sono stati SQL2005, quindi non è stata un'opzione per provare l'impostazione di ottimizzazione per carichi di lavoro ad hoc.

È certamente sempre più difficile includere le prestazioni in una giustificazione per le procedure su query non elaborate. Uno degli argomenti più forti per me ora è "Se usi le procedure, è molto più facile per me aiutare quando sorgono problemi di prestazioni". Un'interfaccia dinamica / linq / orm non ti impedisce di sintonizzarti, ma può limitare fortemente le tue opzioni.


C'è un ottimo articolo correlato qui, inclusi gli script per eliminare quei piani monouso. sqlskills.com/blogs/kimberly/…
SomeGuy

7

SQL Server memorizza nella cache e ottimizza le procedure memorizzate e SQL ad hoc allo stesso modo. Ad esempio, questa procedura:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

Sarà ottimizzato e memorizzato nella cache in modo identico a:

select * from Orders where id = @id

Tuttavia, il seguente SQL ad hoc non può essere memorizzato nella cache in modo efficace, a causa del valore hardcoded:

select * from Orders where id = 42

Sebbene le prestazioni siano le stesse, ci sono buoni motivi per utilizzare le stored procedure. Le procedure memorizzate forniscono una chiara separazione tra DBA e sviluppatori di applicazioni. È utile avere un ulteriore livello di difesa tra i tuoi dati preziosi e i programmi in continua evoluzione :)


+1 soprattutto se si forza l'accesso a tutti gli SP e questi sono ben concepiti come API transazionali non solo come un livello CRUD
Jack Douglas,

Nel 2008+ la id = 42query può essere ottimizzata utilizzando lo stesso piano a seconda delle impostazioni di parametrizzazione semplici / forzate. Naturalmente le query devono essere adeguatamente parametrizzate. :-)
Aaron Bertrand
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.