Memorizzazione nella cache di piani di query (Entity SQL)Query Plan Caching (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.Whenever an attempt to execute a query is made, the query pipeline looks up its query plan cache to see whether the exact query is already compiled and available. In caso affermativo, viene riutilizzato il piano memorizzato nella cache anziché compilarne un nuovo.If so, it reuses the cached plan rather than building a new one. Se non viene individuata una corrispondenza nella cache dei piani di query, la query viene compilata e memorizzata nella cache.If a match is not found in the query plan cache, the query is compiled and cached. Una query è identificata dal testo Entity SQLEntity SQL e dalla raccolta di parametri (nomi e tipi).A query is identified by its Entity SQLEntity SQL text and parameter collection (names and types). In tutti i confronti di testo viene fatta distinzione tra maiuscole e minuscole.All text comparisons are case-sensitive.

ConfigurazioneConfiguration

La memorizzazione nella cache del piano di query può essere configurata tramite EntityCommand.Query plan caching is configurable through the EntityCommand.

Per abilitare o disabilitare la memorizzazione nella cache del piano di query tramite EntityCommand.EnablePlanCaching, impostare questa proprietà su true o su false.To enable or disable query plan caching through EntityCommand.EnablePlanCaching, set this property to true or 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.Disabling plan caching for individual dynamic queries that are unlikely to be used more then once improves performance.

È possibile abilitare la memorizzazione nella cache del piano di query tramite EnablePlanCaching.You can enable query plan caching through EnablePlanCaching.

In genere, è consigliabile evitare le query dinamiche.Dynamic queries should be avoided, in general. L'esempio di query dinamica seguente è vulnerabile ad attacchi SQL injection, in quanto usa direttamente l'input dell'utente senza alcuna convalida.The following dynamic query example is vulnerable to SQL injection attacks, because it takes user input directly without any validation.

"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.If you do use dynamically generated queries, consider disabling query plan caching to avoid unnecessary memory consumption for cache entries that are unlikely to be reused.

La memorizzazione nella cache del piano di query per le query statiche e con parametri può offrire vantaggi a livello di prestazioni.Query plan caching on static queries and parameterized queries can provide performance benefits. Di seguito è riportato un esempio di query statica:The following is an example of a static 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:For queries to be matched properly by the query plan cache, they should comply with the following requirements:

  • Il testo delle query deve essere un modello costante, preferibilmente una risorsa o una stringa costante.Query text should be a constant pattern, preferably a constant string or a resource.

  • È necessario usare EntityParameter o ObjectParameter in ogni situazione in cui deve essere passato un valore fornito dall'utente.EntityParameter or ObjectParameter should be used wherever a user-supplied value must be passed.

È necessario evitare i modelli di query seguenti, che usano inutilmente slot nella cache dei piani di query:You should avoid the following query patterns, which unnecessarily consume slots in the query plan cache:

  • Conversione di caratteri maiuscoli in minuscoli o viceversa nel testo.Changes to letter case in the text.

  • Modifiche degli spazi vuoti.Changes to white space.

  • Modifiche dei valori letterali.Changes to literal values.

  • Modifiche del testo nei commenti.Changes to text inside comments.

Vedere ancheSee Also

Panoramica di Entity SQLEntity SQL Overview