Cache do plano de consulta (Entity SQL)
Sempre que uma tentativa de executar uma consulta é feita, o pipeline de consulta procura seu cache de plano de consulta para ver se a consulta exata já está compilada e disponível. Em caso afirmativo, ele reutiliza o plano armazenado em cache em vez de criar um novo. Se uma correspondência não for encontrada no cache do plano de consulta, a consulta será compilada e armazenada em cache. Uma consulta é identificada por seu texto Entity SQL e coleção de parâmetros (nomes e tipos). Todas as comparações de texto diferenciam maiúsculas de minúsculas.
Configuração
O cache do plano de consulta é configurável através do EntityCommand.
Para habilitar ou desabilitar o cache do plano de consulta através do EntityCommand.EnablePlanCaching, defina essa propriedade como true
ou false
. A desativação do cache de plano para consultas dinâmicas individuais que provavelmente não serão usadas mais do que uma vez melhora o desempenho.
Você pode habilitar o cache do plano de consulta através do EnablePlanCaching.
Prática recomendada
Consultas dinâmicas devem ser evitadas, em geral. O exemplo de consulta dinâmica a seguir é vulnerável a ataques de injeção de SQL, porque recebe a entrada do usuário diretamente sem qualquer validação.
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;
Se você usar consultas geradas dinamicamente, considere desabilitar o cache do plano de consulta para evitar o consumo desnecessário de memória para entradas de cache que provavelmente não serão reutilizadas.
O cache do plano de consulta em consultas estáticas e consultas parametrizadas pode fornecer benefícios de desempenho. Segue-se um exemplo de uma consulta estática:
var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";
Para que as consultas sejam correspondidas corretamente pelo cache do plano de consulta, elas devem estar em conformidade com os seguintes requisitos:
O texto da consulta deve ser um padrão constante, de preferência uma cadeia de caracteres constante ou um recurso.
EntityParameter ou ObjectParameter deve ser usado sempre que um valor fornecido pelo usuário deva ser passado.
Você deve evitar os seguintes padrões de consulta, que consomem slots desnecessariamente no cache do plano de consulta:
Alterações às letras maiúsculas e minúsculas no texto.
Alterações no espaço em branco.
Alterações nos valores literais.
Alterações no texto dentro dos comentários.