Memorizzazione nella cache del piano 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 è 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.
Configurazione
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 System.Data.EntityClient.EntityCommand.EnablePlanCaching, impostare questa proprietà su true o su false. Disabilitando la memorizzazione nella cache del piano di query per singole query dinamiche che non verranno probabilmente utilizzate 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 utilizza direttamente l'input dell'utente senza alcuna convalida.
"SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
Se si utilizzano 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:
"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 utilizzare EntityParameter o ObjectParameter in ogni situazione in cui deve essere passato un valore fornito dall'utente.
È necessario evitare i modelli di query seguenti, che utilizzano 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.