Memorizzazione nella cache di piani di query (Entity SQL)
Ogni volta che viene fatto un tentativo di eseguire una query, la pipeline di query analizza il proprio piano di query per verificare se la query esatta è già stata compilata ed è disponibile. In caso affermativo, viene riutilizzato il piano memorizzato nella cache anziché compilarne un nuovo. Se non viene individuata una corrispondenza nella cache dei piani di query, la query viene compilata e memorizzata nella cache. Una query viene identificata dal testo Entity SQL e dalla raccolta di parametri (nomi e tipi). In tutti i confronti di testo viene fatta distinzione tra maiuscole e minuscole.
Impostazione
La memorizzazione nella cache del piano di query può essere configurata tramite EntityCommand.
Per abilitare o disabilitare la memorizzazione nella cache del piano di query tramite EntityCommand.EnablePlanCaching, impostare questa proprietà su true
o su false
. Disattivando la memorizzazione nella cache del piano di query per singole query dinamiche che non verranno probabilmente usate più di una volta è possibile migliorare le prestazioni.
È possibile abilitare la memorizzazione nella cache del piano di query tramite EnablePlanCaching.
Procedure consigliate
In genere, è consigliabile evitare le query dinamiche. L'esempio di query dinamica seguente è vulnerabile ad attacchi SQL injection, in quanto usa direttamente l'input dell'utente senza alcuna convalida.
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
Se si usano query dinamicamente generate, disabilitare la memorizzazione nella cache del piano di query per evitare un consumo di memoria non necessario per le voci della cache con poche probabilità di riutilizzo.
La memorizzazione nella cache del piano di query per le query statiche e con parametri può offrire vantaggi a livello di prestazioni. Di seguito è riportato un esempio di query statica:
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";
Per garantire una corretta individuazione della corrispondenza delle query con la cache dei piani di query, è necessario che le query siano conformi ai requisiti seguenti:
Il testo delle query deve essere un modello costante, preferibilmente una risorsa o una stringa costante.
È necessario usare EntityParameter o ObjectParameter in ogni situazione in cui deve essere passato un valore fornito dall'utente.
È necessario evitare i modelli di query seguenti, che usano inutilmente slot nella cache dei piani di query:
Conversione di caratteri maiuscoli in minuscoli o viceversa nel testo.
Modifiche degli spazi vuoti.
Modifiche dei valori letterali.
Modifiche del testo nei commenti.